Skip to content

Commit

Permalink
Xcode 6.1
Browse files Browse the repository at this point in the history
Squashed commit of the following:

commit 6b6facc
Author: Mattt Thompson <[email protected]>
Date:   Fri Oct 10 05:30:58 2014 -0700

    [Issue Alamofire#164] Fixed mistake in merge

commit 8a814ee
Merge: 0930f42 29d8b97
Author: Mattt Thompson <[email protected]>
Date:   Thu Oct 9 16:01:55 2014 -0700

    Merge branch 'xcode-6.1' of github.com:Alamofire/Alamofire into xcode-6.1

    Conflicts:
    	Example/DetailViewController.swift
    	Example/MasterViewController.swift
    	Source/Alamofire.swift
    	Tests/ParameterEncodingTests.swift

commit 0930f42
Merge: b1882a1 7362404
Author: Mattt Thompson <[email protected]>
Date:   Thu Oct 9 15:58:36 2014 -0700

    Merge branch 'master' into xcode-6.1

    Conflicts:
    	Source/Alamofire.swift

commit 29d8b97
Merge: 80cc057 18f1d57
Author: Mattt Thompson <[email protected]>
Date:   Sun Oct 5 09:17:17 2014 -0700

    Merge pull request Alamofire#143 from nduplessis/xcode-6.1

    Xcode 6.1 GM fixes

commit 18f1d57
Author: Nico du Plessis <[email protected]>
Date:   Thu Oct 2 13:13:24 2014 +0200

    Xcode 6.1 GM fixes

commit 80cc057
Merge: 38e0783 f8bb0b4
Author: Mattt Thompson <[email protected]>
Date:   Tue Sep 30 09:35:22 2014 -0700

    Merge pull request Alamofire#139 from orta/xcode-6.1

    @mattt => update to support Xcode 6.1b3

commit f8bb0b4
Author: Orta Therox <[email protected]>
Date:   Tue Sep 30 17:17:27 2014 +0100

    update to support Xcode 6.1b3

commit b1882a1
Merge: 34ee306 bc6a58d
Author: Mattt Thompson <[email protected]>
Date:   Thu Sep 25 22:17:50 2014 -0700

    Merge branch 'master' into xcode-6.1

    Conflicts:
    	Source/Alamofire.swift
    	Tests/ParameterEncodingTests.swift

commit 38e0783
Merge: 34ee306 9933340
Author: Mattt Thompson <[email protected]>
Date:   Fri Sep 19 12:02:23 2014 -0700

    Merge pull request Alamofire#114 from rosskimes/xcode-6.1

    Compiles on Xcode 6.1 Beta 2.

commit 9933340
Author: Ross Kimes <[email protected]>
Date:   Fri Sep 19 13:17:02 2014 -0500

    Compiles on Xcode 6.1 Beta 2.

commit 34ee306
Merge: 67ee13a 6c087a9
Author: Mattt Thompson <[email protected]>
Date:   Thu Sep 18 07:49:27 2014 -0700

    Merge branch 'aral-patch-2' into xcode-6.1

commit 6c087a9
Merge: 2abe348 d49bbed
Author: Mattt Thompson <[email protected]>
Date:   Thu Sep 18 07:49:15 2014 -0700

    Merge branch 'patch-2' of github.com:aral/Alamofire into aral-patch-2

commit 67ee13a
Merge: 2abe348 ab4f4c0
Author: Mattt Thompson <[email protected]>
Date:   Thu Sep 18 07:48:31 2014 -0700

    Merge branch 'patch-1' of github.com:aral/Alamofire into aral-patch-1

    Conflicts:
    	Source/Alamofire.swift

commit d49bbed
Author: Aral Balkan <[email protected]>
Date:   Wed Sep 17 00:33:10 2014 +0100

    Replaced toRaw with rawValue (Xcode 6.1 Beta 2 update)

commit ab4f4c0
Author: Aral Balkan <[email protected]>
Date:   Wed Sep 17 00:31:15 2014 +0100

    Updated fromRaw and toRaw to rawValue

    Fixed for Xcode 6.1 Beta 2.
  • Loading branch information
mattt committed Oct 20, 2014
1 parent dafd818 commit 959fb5e
Show file tree
Hide file tree
Showing 11 changed files with 83 additions and 73 deletions.
14 changes: 7 additions & 7 deletions Example/DetailViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ class DetailViewController: UITableViewController {
// MARK: UITableViewDataSource

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch Sections.fromRaw(section)! {
switch Sections(rawValue: section)! {
case .Headers:
return self.headers.count
case .Body:
Expand All @@ -98,20 +98,20 @@ class DetailViewController: UITableViewController {

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

switch Sections.fromRaw(indexPath.section)! {
switch Sections(rawValue: indexPath.section)! {
case .Headers:
let cell = self.tableView.dequeueReusableCellWithIdentifier("Header") as UITableViewCell
let field = self.headers.keys.array.sorted(<)[indexPath.row]
let value = self.headers[field]

cell.textLabel!.text = field
cell.textLabel.text = field
cell.detailTextLabel!.text = value

return cell
case .Body:
let cell = self.tableView.dequeueReusableCellWithIdentifier("Body") as UITableViewCell

cell.textLabel!.text = self.body
cell.textLabel.text = self.body

return cell
}
Expand All @@ -128,7 +128,7 @@ class DetailViewController: UITableViewController {
return ""
}

switch Sections.fromRaw(section)! {
switch Sections(rawValue: section)! {
case .Headers:
return "Headers"
case .Body:
Expand All @@ -137,7 +137,7 @@ class DetailViewController: UITableViewController {
}

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
switch Sections.fromRaw(indexPath.section)! {
switch Sections(rawValue: indexPath.section)! {
case .Body:
return 300
default:
Expand All @@ -146,7 +146,7 @@ class DetailViewController: UITableViewController {
}

override func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String {
if Sections.fromRaw(section)! == .Body && self.elapsedTime != nil {
if Sections(rawValue: section)! == .Body && self.elapsedTime != nil {
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = .DecimalStyle

Expand Down
4 changes: 2 additions & 2 deletions Example/HTTPBin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@ enum HTTPBinRoute: URLStringConvertible {
let path: String = {
switch self {
case .Method(let method):
return "/\(method.toRaw().lowercaseString)"
return "/\(method.rawValue.lowercaseString)"
case .BasicAuth(let user, let password):
return "/basic-auth/\(user)/\(password)"
}
}()

return NSURL(string: path, relativeToURL: NSURL(string: baseURLString)).absoluteString!
return NSURL(string: path, relativeToURL: NSURL(string: baseURLString))!.absoluteString!
}
}

13 changes: 9 additions & 4 deletions Example/MasterViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,15 @@ class MasterViewController: UITableViewController {
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let detailViewController = segue.destinationViewController.topViewController as? DetailViewController {
func requestForSegue(segue: UIStoryboardSegue) -> Request? {
switch segue.identifier {
case "GET", "POST", "PUT", "DELETE":
let method = Alamofire.Method.fromRaw(segue.identifier)!
return Alamofire.request(method, HTTPBinRoute.Method(method))
switch segue.identifier as String! {
case "GET":
return Alamofire.request(.GET, "http://httpbin.org/get")
case "POST":
return Alamofire.request(.POST, "http://httpbin.org/post")
case "PUT":
return Alamofire.request(.PUT, "http://httpbin.org/put")
case "DELETE":
return Alamofire.request(.DELETE, "http://httpbin.org/delete")
default:
return nil
}
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@ Alamofire is an HTTP networking library written in Swift, from the [creator](htt
## Requirements

- iOS 7.0+ / Mac OS X 10.9+
- Xcode 6.0

> For Xcode 6.1, use [the `xcode-6.1` branch](https://github.com/Alamofire/Alamofire/tree/xcode-6.1).
- Xcode 6.1

## Communication

Expand All @@ -32,6 +30,8 @@ Alamofire is an HTTP networking library written in Swift, from the [creator](htt

## Installation

> For application targets that do not support embedded frameworks, such as iOS 7, Alamofire can be integrated by including the `Alamofire.swift` source file directly, and making the appropriate changes to calling semantics.
_Due to the current lack of [proper infrastructure](http://cocoapods.org) for Swift dependency management, using Alamofire in your project requires the following steps:_

1. Add Alamofire as a [submodule](http://git-scm.com/docs/git-submodule) by opening the Terminal, `cd`-ing into your top-level project directory, and entering the command `git submodule add https://github.com/Alamofire/Alamofire.git`
Expand Down
47 changes: 24 additions & 23 deletions Source/Alamofire.swift
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,12 @@ public enum ParameterEncoding {
}
}

let method = Method.fromRaw(mutableURLRequest.HTTPMethod)
let method = Method(rawValue: mutableURLRequest.HTTPMethod)
if method != nil && encodesParametersInURL(method!) {
let URLComponents = NSURLComponents(URL: mutableURLRequest.URL!, resolvingAgainstBaseURL: false)
URLComponents.percentEncodedQuery = (URLComponents.query != nil ? URLComponents.query! + "&" : "") + query(parameters!)
mutableURLRequest.URL = URLComponents.URL
if let URLComponents = NSURLComponents(URL: mutableURLRequest.URL!, resolvingAgainstBaseURL: false) {
URLComponents.percentEncodedQuery = (URLComponents.query != nil ? URLComponents.query! + "&" : "") + query(parameters!)
mutableURLRequest.URL = URLComponents.URL
}
} else {
if mutableURLRequest.valueForHTTPHeaderField("Content-Type") == nil {
mutableURLRequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
Expand Down Expand Up @@ -241,18 +242,18 @@ public class Manager {

// User-Agent Header; see http://tools.ietf.org/html/rfc7231#section-5.5.3
let userAgent: String = {
let info = NSBundle.mainBundle().infoDictionary
let executable: AnyObject = info[kCFBundleExecutableKey] ?? "Unknown"
let bundle: AnyObject = info[kCFBundleIdentifierKey] ?? "Unknown"
let version: AnyObject = info[kCFBundleVersionKey] ?? "Unknown"
let os: AnyObject = NSProcessInfo.processInfo().operatingSystemVersionString ?? "Unknown"

var mutableUserAgent = NSMutableString(string: "\(executable)/\(bundle) (\(version); OS \(os))") as CFMutableString
let transform = NSString(string: "Any-Latin; Latin-ASCII; [:^ASCII:] Remove") as CFString
if CFStringTransform(mutableUserAgent, nil, transform, 0) == 1 {
return mutableUserAgent as NSString
if let info = NSBundle.mainBundle().infoDictionary {
let executable: AnyObject = info[kCFBundleExecutableKey] ?? "Unknown"
let bundle: AnyObject = info[kCFBundleIdentifierKey] ?? "Unknown"
let version: AnyObject = info[kCFBundleVersionKey] ?? "Unknown"
let os: AnyObject = NSProcessInfo.processInfo().operatingSystemVersionString ?? "Unknown"

var mutableUserAgent = NSMutableString(string: "\(executable)/\(bundle) (\(version); OS \(os))") as CFMutableString
let transform = NSString(string: "Any-Latin; Latin-ASCII; [:^ASCII:] Remove") as CFString
if CFStringTransform(mutableUserAgent, nil, transform, 0) == 1 {
return mutableUserAgent as NSString
}
}

return "Alamofire"
}()

Expand Down Expand Up @@ -1235,8 +1236,8 @@ extension Request: DebugPrintable {
components.append("-X \(request.HTTPMethod!)")
}

if let credentialStorage = session.configuration.URLCredentialStorage {
let protectionSpace = NSURLProtectionSpace(host: URL.host!, port: URL.port ?? 0, `protocol`: URL.scheme, realm: URL.host, authenticationMethod: NSURLAuthenticationMethodHTTPBasic)
if let credentialStorage = self.session.configuration.URLCredentialStorage {
let protectionSpace = NSURLProtectionSpace(host: URL.host!, port: URL.port?.integerValue ?? 0, `protocol`: URL.scheme!, realm: URL.host!, authenticationMethod: NSURLAuthenticationMethodHTTPBasic)
if let credentials = credentialStorage.credentialsForProtectionSpace(protectionSpace)?.values.array {
for credential: NSURLCredential in (credentials as [NSURLCredential]) {
components.append("-u \(credential.user!):\(credential.password!)")
Expand Down Expand Up @@ -1276,9 +1277,9 @@ extension Request: DebugPrintable {
}

if let HTTPBody = request.HTTPBody {
let escapedBody = NSString(data: HTTPBody, encoding: NSUTF8StringEncoding)
.stringByReplacingOccurrencesOfString("\"", withString: "\\\"")
components.append("-d \"\(escapedBody)\"")
if let escapedBody = NSString(data: HTTPBody, encoding: NSUTF8StringEncoding)?.stringByReplacingOccurrencesOfString("\"", withString: "\\\"") {
components.append("-d \"\(escapedBody)\"")
}
}

components.append("\"\(URL.absoluteString!)\"")
Expand Down Expand Up @@ -1438,9 +1439,9 @@ extension Request {

// MARK: - Convenience -

private func URLRequest(method: Method, URLString: URLStringConvertible) -> NSURLRequest {
let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: URLString.URLString))
mutableURLRequest.HTTPMethod = method.toRaw()
private func URLRequest(method: Method, URL: URLStringConvertible) -> NSURLRequest {
let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: URL.URLString)!)
mutableURLRequest.HTTPMethod = method.rawValue

return mutableURLRequest
}
Expand Down
15 changes: 9 additions & 6 deletions Tests/DownloadTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -63,15 +63,18 @@ class AlamofireDownloadResponseTestCase: XCTestCase {
let contents = fileManager.contentsOfDirectoryAtURL(directory, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsHiddenFiles, error: &fileManagerError)!
XCTAssertNil(fileManagerError, "fileManagerError should be nil")

let predicate = NSPredicate(format: "lastPathComponent = '\(numberOfLines)'")
let predicate = NSPredicate(format: "lastPathComponent = '\(numberOfLines)'")!
let filteredContents = (contents as NSArray).filteredArrayUsingPredicate(predicate)
XCTAssertEqual(filteredContents.count, 1, "should have one file in Documents")

let file = filteredContents.first as NSURL
XCTAssertEqual(file.lastPathComponent, "\(numberOfLines)", "filename should be \(numberOfLines)")

let data = NSData(contentsOfURL: file)
XCTAssertGreaterThan(data.length, 0, "data length should be non-zero")
if let data = NSData(contentsOfURL: file) {
XCTAssertGreaterThan(data.length, 0, "data length should be non-zero")
} else {
XCTFail("data should exist for contents of URL")
}
}

waitForExpectationsWithTimeout(10) { (error) in
Expand All @@ -91,9 +94,9 @@ class AlamofireDownloadResponseTestCase: XCTestCase {
download.progress { (bytesRead, totalBytesRead, totalBytesExpectedToRead) -> Void in
expectation.fulfill()

XCTAssertGreaterThan(bytesRead, 0, "bytesRead should be > 0")
XCTAssertGreaterThan(totalBytesRead, 0, "totalBytesRead should be > 0")
XCTAssertEqual(totalBytesExpectedToRead, -1, "totalBytesExpectedToRead should be -1")
XCTAssert(bytesRead > 0, "bytesRead should be > 0")
XCTAssert(totalBytesRead > 0, "totalBytesRead should be > 0")
XCTAssert(totalBytesExpectedToRead == -1, "totalBytesExpectedToRead should be -1")

download.cancel()
}
Expand Down
4 changes: 2 additions & 2 deletions Tests/ManagerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ class AlamofireManagerTestCase: XCTestCase {
let manager = Alamofire.Manager()
manager.startRequestsImmediately = false

let URL = "http://httpbin.org/get"
let URLRequest = NSURLRequest(URL: NSURL(string: URL))
let URL = NSURL(string: "http://httpbin.org/get")!
let URLRequest = NSURLRequest(URL: URL)

let expectation = expectationWithDescription("\(URL)")

Expand Down
17 changes: 9 additions & 8 deletions Tests/ParameterEncodingTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class AlamofireURLParameterEncodingTestCase: XCTestCase {
override func setUp() {
super.setUp()

let URL = NSURL(string: "http://example.com/")
let URL = NSURL(string: "http://example.com/")!
self.URLRequest = NSURLRequest(URL: URL)
}

Expand All @@ -52,7 +52,7 @@ class AlamofireURLParameterEncodingTestCase: XCTestCase {

func testURLParameterEncodeOneStringKeyStringValueParameterAppendedToQuery() {
var mutableURLRequest = self.URLRequest.mutableCopy() as NSMutableURLRequest
let URLComponents = NSURLComponents(URL: mutableURLRequest.URL!, resolvingAgainstBaseURL: false)
let URLComponents = NSURLComponents(URL: mutableURLRequest.URL!, resolvingAgainstBaseURL: false)!
URLComponents.query = "baz=qux"
mutableURLRequest.URL = URLComponents.URL

Expand Down Expand Up @@ -174,7 +174,7 @@ class AlamofireURLParameterEncodingTestCase: XCTestCase {

func testURLParameterEncodeGETParametersInURL() {
var mutableURLRequest = self.URLRequest.mutableCopy() as NSMutableURLRequest
mutableURLRequest.HTTPMethod = Method.GET.toRaw()
mutableURLRequest.HTTPMethod = Method.GET.rawValue

let parameters = ["foo": 1, "bar": 2]
let (URLRequest, error) = self.encoding.encode(mutableURLRequest, parameters: parameters)
Expand All @@ -186,12 +186,12 @@ class AlamofireURLParameterEncodingTestCase: XCTestCase {

func testURLParameterEncodePOSTParametersInHTTPBody() {
var mutableURLRequest = self.URLRequest.mutableCopy() as NSMutableURLRequest
mutableURLRequest.HTTPMethod = Method.POST.toRaw()
mutableURLRequest.HTTPMethod = Method.POST.rawValue

let parameters = ["foo": 1, "bar": 2]
let (URLRequest, error) = self.encoding.encode(mutableURLRequest, parameters: parameters)

XCTAssertEqual(NSString(data: URLRequest.HTTPBody!, encoding: NSUTF8StringEncoding), "bar=2&foo=1", "HTTPBody is incorrect")
XCTAssertEqual(NSString(data: URLRequest.HTTPBody!, encoding: NSUTF8StringEncoding)!, "bar=2&foo=1", "HTTPBody is incorrect")
XCTAssertEqual(URLRequest.valueForHTTPHeaderField("Content-Type")!, "application/x-www-form-urlencoded", "Content-Type should be application/x-www-form-urlencoded")
XCTAssertNotNil(URLRequest.HTTPBody, "HTTPBody should not be nil")
}
Expand All @@ -204,7 +204,7 @@ class AlamofireJSONParameterEncodingTestCase: XCTestCase {
override func setUp() {
super.setUp()

let URL = NSURL(string: "http://example.com/")
let URL = NSURL(string: "http://example.com/")!
self.URLRequest = NSURLRequest(URL: URL)
}

Expand Down Expand Up @@ -250,7 +250,7 @@ class AlamofirePropertyListParameterEncodingTestCase: XCTestCase {
override func setUp() {
super.setUp()

let URL = NSURL(string: "http://example.com/")
let URL = NSURL(string: "http://example.com/")!
self.URLRequest = NSURLRequest(URL: URL)
}

Expand Down Expand Up @@ -322,7 +322,8 @@ class AlamofireCustomParameterEncodingTestCase: XCTestCase {

let encoding: ParameterEncoding = .Custom(encodingClosure)

let URLRequest = NSURLRequest(URL: NSURL(string: "http://example.com"))
let URL = NSURL(string: "http://example.com")!
let URLRequest = NSURLRequest(URL: URL)
let parameters: [String: AnyObject] = [:]

XCTAssertEqual(encoding.encode(URLRequest, parameters: parameters).0, encodingClosure(URLRequest, parameters).0, "URLRequest should be equal")
Expand Down
22 changes: 11 additions & 11 deletions Tests/RequestTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class AlamofireRequestInitializationTestCase: XCTestCase {
let request = Alamofire.request(.GET, URL)

XCTAssertNotNil(request.request, "request should not be nil")
XCTAssertEqual(request.request.URL, NSURL(string: URL), "request URL should be equal")
XCTAssertEqual(request.request.URL, NSURL(string: URL)!, "request URL should be equal")
XCTAssertNil(request.response, "response should be nil")
}

Expand All @@ -39,7 +39,7 @@ class AlamofireRequestInitializationTestCase: XCTestCase {
let request = Alamofire.request(.GET, URL, parameters: ["foo": "bar"])

XCTAssertNotNil(request.request, "request should not be nil")
XCTAssertNotEqual(request.request.URL, NSURL(string: URL), "request URL should be equal")
XCTAssertNotEqual(request.request.URL, NSURL(string: URL)!, "request URL should be equal")
XCTAssertEqual(request.request.URL.query!, "foo=bar", "query is incorrect")
XCTAssertNil(request.response, "response should be nil")
}
Expand Down Expand Up @@ -101,30 +101,30 @@ class AlamofireRequestDebugDescriptionTestCase: XCTestCase {
let request = Alamofire.request(.GET, URL)
let components = cURLCommandComponents(request)

XCTAssertEqual(components[0..<3], ["$", "curl", "-i"])
XCTAssert(components[0..<3] == ["$", "curl", "-i"], "components should be equal")
XCTAssert(!contains(components, "-X"), "command should not contain explicit -X flag")
XCTAssertEqual(components.last!, "\"\(URL)\"")
XCTAssert(components.last! == "\"\(URL)\"", "URL component should be equal")
}

func testPOSTRequestDebugDescription() {
let URL = "http://httpbin.org/post"
let request = Alamofire.request(.POST, URL)
let components = cURLCommandComponents(request)

XCTAssertEqual(components[0..<3], ["$", "curl", "-i"])
XCTAssertEqual(components[3..<5], ["-X", "POST"])
XCTAssertEqual(components.last!, "\"\(URL)\"")
XCTAssert(components[0..<3] == ["$", "curl", "-i"], "components should be equal")
XCTAssert(components[3..<5] == ["-X", "POST"], "command should contain explicit -X flag")
XCTAssert(components.last! == "\"\(URL)\"", "URL component should be equal")
}

func testPOSTRequestWithJSONParametersDebugDescription() {
let URL = "http://httpbin.org/post"
let request = Alamofire.request(.POST, URL, parameters: ["foo": "bar"], encoding: .JSON)
let components = cURLCommandComponents(request)

XCTAssertEqual(components[0..<3], ["$", "curl", "-i"])
XCTAssertEqual(components[3..<5], ["-X", "POST"])
XCTAssert(components[0..<3] == ["$", "curl", "-i"], "components should be equal")
XCTAssert(components[3..<5] == ["-X", "POST"], "command should contain explicit -X flag")
XCTAssert(request.debugDescription.rangeOfString("-H \"Content-Type: application/json\"") != nil)
XCTAssert(request.debugDescription.rangeOfString("-d \"{\"foo\":\"bar\"}\"") != nil)
XCTAssertEqual(components.last!, "\"\(URL)\"")
XCTAssert(request.debugDescription.rangeOfString("-d \"{\\\"foo\\\":\\\"bar\\\"}\"") != nil)
XCTAssert(components.last! == "\"\(URL)\"", "URL component should be equal")
}
}
Loading

0 comments on commit 959fb5e

Please sign in to comment.