diff --git a/.travis.yml b/.travis.yml index 62d57ffb..ac640554 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: objective-c -osx_image: xcode9 +osx_image: xcode9.3 xcode_workspace: ShadowsocksX-NG.xcworkspace xcode_scheme: ShadowsocksX-NG script: set -o pipefail && xcodebuild test -workspace ShadowsocksX-NG.xcworkspace -scheme ShadowsocksX-NG|xcpretty diff --git a/LaunchHelper/LaunchHelper.xcodeproj/project.pbxproj b/LaunchHelper/LaunchHelper.xcodeproj/project.pbxproj index a98ae5e6..6a8cbf29 100644 --- a/LaunchHelper/LaunchHelper.xcodeproj/project.pbxproj +++ b/LaunchHelper/LaunchHelper.xcodeproj/project.pbxproj @@ -97,7 +97,7 @@ 9B9F13851E8A282C00DE4794 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0900; + LastUpgradeCheck = 0930; ORGANIZATIONNAME = qiuyuzhou; TargetAttributes = { 9B9F138C1E8A282C00DE4794 = { @@ -173,6 +173,7 @@ 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; @@ -180,6 +181,7 @@ 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; @@ -226,6 +228,7 @@ 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; @@ -233,6 +236,7 @@ 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; diff --git a/Podfile b/Podfile index 5408ff77..7d2828c6 100644 --- a/Podfile +++ b/Podfile @@ -7,13 +7,13 @@ target 'ShadowsocksX-NG' do use_frameworks! # Pods for ShadowsocksX-NG - pod 'Alamofire', '~> 4.2.0' + pod 'Alamofire', '~> 4.7.2' pod "GCDWebServer", "~> 3.0" pod 'MASShortcut', '~> 2' # https://github.com/ReactiveX/RxSwift/blob/master/Documentation/GettingStarted.md - pod 'RxSwift', '~> 3.0' - pod 'RxCocoa', '~> 3.0' + pod 'RxSwift', '~> 4.1.2' + pod 'RxCocoa', '~> 4.1.2' target 'ShadowsocksX-NGTests' do inherit! :search_paths diff --git a/Podfile.lock b/Podfile.lock index 1c817224..d2046955 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,30 +1,30 @@ PODS: - - Alamofire (4.2.0) + - Alamofire (4.7.2) - BRLOptionParser (0.3.1) - GCDWebServer (3.4.2): - GCDWebServer/Core (= 3.4.2) - GCDWebServer/Core (3.4.2) - MASShortcut (2.3.6) - - RxCocoa (3.6.1): - - RxSwift (~> 3.6) - - RxSwift (3.6.1) + - RxCocoa (4.1.2): + - RxSwift (~> 4.0) + - RxSwift (4.1.2) DEPENDENCIES: - - Alamofire (~> 4.2.0) + - Alamofire (~> 4.7.2) - BRLOptionParser (~> 0.3.1) - GCDWebServer (~> 3.0) - MASShortcut (~> 2) - - RxCocoa (~> 3.0) - - RxSwift (~> 3.0) + - RxCocoa (~> 4.1.2) + - RxSwift (~> 4.1.2) SPEC CHECKSUMS: - Alamofire: aa2e09d871c9160ac53c90e83c68064a94e3dfbe + Alamofire: e4fa87002c137ba2d8d634d2c51fabcda0d5c223 BRLOptionParser: a03256a8ff003ca1f5376c55f55f210e085a3958 GCDWebServer: 8d67ee9f634b4bb91eb4b8aee440318a5fc6debd MASShortcut: 9c215e8a8a78f3d01ce56da48e2730ab66b538fa - RxCocoa: 84a08739ab186248c7f31ce4ee92d6f8a947d690 - RxSwift: f9de85ea20cd2f7716ee5409fc13523dc638e4e4 + RxCocoa: d88ba0f1f6abf040011a9eb4b539324fc426843a + RxSwift: e49536837d9901277638493ea537394d4b55f570 -PODFILE CHECKSUM: 5abdd116651e99453ca2480b0a17344fadc111ea +PODFILE CHECKSUM: 00940d7054f9c0a5f67a7f3be8edb28676d11545 -COCOAPODS: 1.3.1 +COCOAPODS: 1.4.0 diff --git a/Pods/Alamofire/LICENSE b/Pods/Alamofire/LICENSE index 4cfbf72a..2ec3cb14 100644 --- a/Pods/Alamofire/LICENSE +++ b/Pods/Alamofire/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +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 diff --git a/Pods/Alamofire/README.md b/Pods/Alamofire/README.md index f16157e9..f29cfce2 100644 --- a/Pods/Alamofire/README.md +++ b/Pods/Alamofire/README.md @@ -1,10 +1,11 @@ -![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/assets/alamofire.png) +![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/master/alamofire.png) [![Build Status](https://travis-ci.org/Alamofire/Alamofire.svg?branch=master)](https://travis-ci.org/Alamofire/Alamofire) [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Alamofire.svg)](https://img.shields.io/cocoapods/v/Alamofire.svg) [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) -[![Platform](https://img.shields.io/cocoapods/p/Alamofire.svg?style=flat)](http://cocoadocs.org/docsets/Alamofire) +[![Platform](https://img.shields.io/cocoapods/p/Alamofire.svg?style=flat)](https://alamofire.github.io/Alamofire) [![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](http://twitter.com/AlamofireSF) +[![Gitter](https://badges.gitter.im/Alamofire/Alamofire.svg)](https://gitter.im/Alamofire/Alamofire?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) Alamofire is an HTTP networking library written in Swift. @@ -14,16 +15,16 @@ Alamofire is an HTTP networking library written in Swift. - [Migration Guides](#migration-guides) - [Communication](#communication) - [Installation](#installation) -- [Usage](#usage) - - **Intro -** [Making a Request](#making-a-request), [Response Handling](#response-handling), [Response Validation](#response-validation), [Response Caching](#response-caching) - - **HTTP -** [HTTP Methods](#http-methods), [Parameter Encoding](#parameter-encoding), [HTTP Headers](#http-headers), [Authentication](#authentication) - - **Large Data -** [Downloading Data to a File](#downloading-data-to-a-file), [Uploading Data to a Server](#uploading-data-to-a-server) - - **Tools -** [Statistical Metrics](#statistical-metrics), [cURL Command Output](#curl-command-output) -- [Advanced Usage](#advanced-usage) - - **URL Session -** [Session Manager](#session-manager), [Session Delegate](#session-delegate), [Request](#request) - - **Routing -** [Routing Requests](#routing-requests), [Adapting and Retrying Requests](#adapting-and-retrying-requests) - - **Model Objects -** [Custom Response Serialization](#custom-response-serialization) - - **Connection -** [Security](#security), [Network Reachability](#network-reachability) +- [Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md) + - **Intro -** [Making a Request](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#making-a-request), [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), [Parameter Encoding](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#parameter-encoding), [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-manager), [Session Delegate](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#session-delegate), [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) + - **Model Objects -** [Custom Response Serialization](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#custom-response-serialization) + - **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) @@ -44,7 +45,7 @@ Alamofire is an HTTP networking library written in Swift. - [x] TLS Certificate and Public Key Pinning - [x] Network Reachability - [x] Comprehensive Unit and Integration Test Coverage -- [x] [Complete Documentation](http://cocoadocs.org/docsets/Alamofire) +- [x] [Complete Documentation](https://alamofire.github.io/Alamofire) ## Component Libraries @@ -56,8 +57,8 @@ In order to keep Alamofire focused specifically on core networking implementatio ## Requirements - iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+ -- Xcode 8.1+ -- Swift 3.0+ +- Xcode 8.3+ +- Swift 3.1+ ## Migration Guides @@ -83,7 +84,7 @@ In order to keep Alamofire focused specifically on core networking implementatio $ gem install cocoapods ``` -> CocoaPods 1.1.0+ is required to build Alamofire 4.0.0+. +> CocoaPods 1.1+ is required to build Alamofire 4.0+. To integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`: @@ -93,7 +94,7 @@ platform :ios, '10.0' use_frameworks! target '' do - pod 'Alamofire', '~> 4.0' + pod 'Alamofire', '~> 4.7' end ``` @@ -117,1597 +118,85 @@ $ brew install carthage To integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`: ```ogdl -github "Alamofire/Alamofire" ~> 4.0 +github "Alamofire/Alamofire" ~> 4.7 ``` Run `carthage update` to build the framework and drag the built `Alamofire.framework` into your Xcode project. -### Manually - -If you prefer not to use either 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](http://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 OS X. - - > You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as either `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. - ---- - -## Usage - -### Making a Request - -```swift -import Alamofire - -Alamofire.request("https://httpbin.org/get") -``` - -### Response Handling - -Handling the `Response` of a `Request` made in Alamofire involves chaining a response handler onto the `Request`. - -```swift -Alamofire.request("https://httpbin.org/get").responseJSON { response in - print(response.request) // original URL request - print(response.response) // HTTP URL response - print(response.data) // server data - print(response.result) // result of response serialization - - if let JSON = response.result.value { - print("JSON: \(JSON)") - } -} -``` - -In the above example, the `responseJSON` handler is appended to the `Request` to be executed once the `Request` is complete. Rather than blocking execution to wait for a response from the server, a [callback](http://en.wikipedia.org/wiki/Callback_%28computer_programming%29) in the form of a closure is specified 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 response handlers by default including: - -```swift -// Response Handler - Unserialized Response -func response( - queue: DispatchQueue?, - completionHandler: @escaping (DefaultDataResponse) -> Void) - -> Self - -// Response Data Handler - Serialized into Data -func responseData( - queue: DispatchQueue?, - completionHandler: @escaping (DataResponse) -> Void) - -> Self - -// Response String Handler - Serialized into String -func responseString( - queue: DispatchQueue?, - encoding: String.Encoding?, - completionHandler: @escaping (DataResponse) -> Void) - -> Self - -// Response JSON Handler - Serialized into Any -func responseJSON( - queue: DispatchQueue?, - completionHandler: @escaping (DataResponse) -> Void) - -> Self - -// Response PropertyList (plist) Handler - Serialized into Any -func responsePropertyList( - queue: DispatchQueue?, - completionHandler: @escaping (DataResponse) -> 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..<499` and `500..<599` 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 URL session delegate. It is the Alamofire equivalent of using `cURL` to execute a `Request`. - -```swift -Alamofire.request("https://httpbin.org/get").response { response in - print("Request: \(response.request)") - print("Response: \(response.response)") - print("Error: \(response.error)") - - if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) { - print("Data: \(utf8Text)") - } -} -``` - -> We strongly encourage you to leverage the other response serializers taking advantage of `Response` and `Result` types. - -#### Response Data Handler - -The `responseData` handler uses the `responseDataSerializer` (the object that serializes the server data into some other type) to extract 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 of type `Data`. - -```swift -Alamofire.request("https://httpbin.org/get").responseData { response in - debugPrint("All Response Info: \(response)") - - if let data = response.result.value, let utf8Text = String(data: data, encoding: .utf8) { - print("Data: \(utf8Text)") - } -} -``` - -#### Response String Handler - -The `responseString` handler uses the `responseStringSerializer` 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 -Alamofire.request("https://httpbin.org/get").responseString { response in - print("Success: \(response.result.isSuccess)") - print("Response String: \(response.result.value)") -} -``` - -> 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 JSON Handler - -The `responseJSON` handler uses the `responseJSONSerializer` to convert the `Data` returned by the server into an `Any` type using the specified `JSONSerialization.ReadingOptions`. If no errors occur and the server data is successfully serialized into a JSON object, the response `Result` will be a `.success` and the `value` will be of type `Any`. - -```swift -Alamofire.request("https://httpbin.org/get").responseJSON { response in - debugPrint(response) - - if let json = response.result.value { - print("JSON: \(json)") - } -} -``` - -> All JSON serialization is handled by the `JSONSerialization` API in the `Foundation` framework. - -#### Chained Response Handlers - -Response handlers can even be chained: - -```swift -Alamofire.request("https://httpbin.org/get") - .responseString { response in - print("Response String: \(response.result.value)") - } - .responseJSON { response in - print("Response JSON: \(response.result.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. - -#### Response Handler Queue - -Response handlers by default are executed on the main dispatch queue. However, a custom dispatch queue can be provided instead. - -```swift -let utilityQueue = DispatchQueue.global(qos: .utility) - -Alamofire.request("https://httpbin.org/get").responseJSON(queue: utilityQueue) { response in - print("Executing response handler on utility queue") -} -``` - -### 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. - -#### Manual Validation - -```swift -Alamofire.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 .failure(let error): - print(error) - } - } -``` - -#### Automatic Validation - -Automatically validates status code within `200...299` range, and that the `Content-Type` header of the response matches the `Accept` header of the request, if one is provided. - -```swift -Alamofire.request("https://httpbin.org/get").validate().responseJSON { response in - switch response.result { - case .success: - print("Validation Successful") - case .failure(let error): - print(error) - } -} -``` - -### 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 shared `URLCache`. In order to customize it, see the [Session Manager Configurations](#session-manager) section. - -### HTTP Methods - -The `HTTPMethod` enumeration lists the HTTP methods defined in [RFC 7231 §4.3](http://tools.ietf.org/html/rfc7231#section-4.3): - -```swift -public enum HTTPMethod: String { - case options = "OPTIONS" - case get = "GET" - case head = "HEAD" - case post = "POST" - case put = "PUT" - case patch = "PATCH" - case delete = "DELETE" - case trace = "TRACE" - case connect = "CONNECT" -} -``` - -These values can be passed as the `method` argument to the `Alamofire.request` API: - -```swift -Alamofire.request("https://httpbin.org/get") // method defaults to `.get` - -Alamofire.request("https://httpbin.org/post", method: .post) -Alamofire.request("https://httpbin.org/put", method: .put) -Alamofire.request("https://httpbin.org/delete", method: .delete) -``` - -> The `Alamofire.request` method parameter defaults to `.get`. - -### Parameter Encoding - -Alamofire supports three types of parameter encoding including: `URL`, `JSON` and `PropertyList`. It can also support any custom encoding that conforms to the `ParameterEncoding` protocol. - -#### URL Encoding - -The `URLEncoding` type 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 `Destination` enumeration has three cases: - -- `.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. - -The `Content-Type` HTTP header field of an encoded request with HTTP body is set to `application/x-www-form-urlencoded; charset=utf-8`. Since there is no published specification for how to encode collection types, 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`). - -##### GET Request With URL-Encoded Parameters - -```swift -let parameters: Parameters = ["foo": "bar"] - -// All three of these calls are equivalent -Alamofire.request("https://httpbin.org/get", parameters: parameters) // encoding defaults to `URLEncoding.default` -Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding.default) -Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding(destination: .methodDependent)) - -// https://httpbin.org/get?foo=bar -``` - -##### POST Request With URL-Encoded Parameters - -```swift -let parameters: Parameters = [ - "foo": "bar", - "baz": ["a", 1], - "qux": [ - "x": 1, - "y": 2, - "z": 3 - ] -] - -// All three of these calls are equivalent -Alamofire.request("https://httpbin.org/post", parameters: parameters) -Alamofire.request("https://httpbin.org/post", parameters: parameters, encoding: URLEncoding.default) -Alamofire.request("https://httpbin.org/post", parameters: parameters, encoding: URLEncoding.httpBody) - -// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3 -``` - -#### JSON Encoding - -The `JSONEncoding` type creates a JSON representation of the parameters object, which is set as the HTTP body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`. - -##### POST Request with JSON-Encoded Parameters - -```swift -let parameters: Parameters = [ - "foo": [1,2,3], - "bar": [ - "baz": "qux" - ] -] - -// Both calls are equivalent -Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding.default) -Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding(options: [])) - -// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}} -``` - -#### Property List Encoding - -The `PropertyListEncoding` uses `PropertyListSerialization` to create a plist representation of the parameters object, according to the associated format and write options values, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/x-plist`. - -#### Custom Encoding - -In the event that the provided `ParameterEncoding` types do not meet your needs, you can create your own custom encoding. Here's a quick example of how you could build a custom `JSONStringArrayEncoding` type to encode a JSON string array onto a `Request`. - -```swift -struct JSONStringArrayEncoding: ParameterEncoding { - private let array: [String] - - init(array: [String]) { - self.array = array - } - - func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { - var urlRequest = urlRequest.urlRequest - - let data = try JSONSerialization.data(withJSONObject: array, options: []) - - if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil { - urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") - } - - urlRequest.httpBody = data - - return urlRequest - } -} -``` - -#### Manual Parameter Encoding of a URLRequest - -The `ParameterEncoding` APIs can be used outside of making network requests. - -```swift -let url = URL(string: "https://httpbin.org/get")! -var urlRequest = URLRequest(url: url) - -let parameters: Parameters = ["foo": "bar"] -let encodedURLRequest = try URLEncoding.queryString.encode(urlRequest, with: parameters) -``` - -### HTTP Headers - -Adding a custom HTTP header to a `Request` is supported directly in the global `request` method. This makes it easy to attach HTTP headers to a `Request` that can be constantly changing. - -```swift -let headers: HTTPHeaders = [ - "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==", - "Accept": "application/json" -] - -Alamofire.request("https://httpbin.org/headers", headers: headers).responseJSON { 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 Manager Configurations](#session-manager) section. - -The default Alamofire `SessionManager` provides a default set of headers for every `Request`. These include: - -- `Accept-Encoding`, which defaults to `gzip;q=1.0, compress;q=0.5`, 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 10.0.0) Alamofire/4.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 `defaultHTTPHeaders` property updated and the configuration applied to a new `SessionManager` instance. - -### 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). - -**Supported Authentication Schemes** - -- [HTTP Basic](http://en.wikipedia.org/wiki/Basic_access_authentication) -- [HTTP Digest](http://en.wikipedia.org/wiki/Digest_access_authentication) -- [Kerberos](http://en.wikipedia.org/wiki/Kerberos_%28protocol%29) -- [NTLM](http://en.wikipedia.org/wiki/NT_LAN_Manager) - -#### HTTP Basic Authentication - -The `authenticate` method on a `Request` will automatically provide a `URLCredential` to a `URLAuthenticationChallenge` when appropriate: - -```swift -let user = "user" -let password = "password" - -Alamofire.request("https://httpbin.org/basic-auth/\(user)/\(password)") - .authenticate(user: user, password: password) - .responseJSON { response in - debugPrint(response) - } -``` - -Depending upon your server implementation, an `Authorization` header may also be appropriate: - -```swift -let user = "user" -let password = "password" - -var headers: HTTPHeaders = [:] - -if let authorizationHeader = Request.authorizationHeader(user: user, password: password) { - headers[authorizationHeader.key] = authorizationHeader.value -} - -Alamofire.request("https://httpbin.org/basic-auth/user/password", headers: headers) - .responseJSON { response in - debugPrint(response) - } -``` - -#### Authentication with URLCredential - -```swift -let user = "user" -let password = "password" - -let credential = URLCredential(user: user, password: password, persistence: .forSession) - -Alamofire.request("https://httpbin.org/basic-auth/\(user)/\(password)") - .authenticate(usingCredential: credential) - .responseJSON { 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`. - -### Downloading Data to a File - -Requests made in Alamofire that fetch data from a server can download the data in-memory or on-disk. The `Alamofire.request` APIs used in all the examples so far always downloads the server data in-memory. This is great for smaller payloads because it's more efficient, but really bad for larger payloads because the download could run your entire application out-of-memory. Because of this, you can also use the `Alamofire.download` APIs to download the server data to a temporary file on-disk. - -```swift -Alamofire.download("https://httpbin.org/image/png").responseData { response in - if let data = response.result.value { - let image = UIImage(data: data) - } -} -``` - -> The `Alamofire.download` APIs should also be used if you need to download data while your app is in the background. For more information, please see the [Session Manager Configurations](#session-manager) section. - -#### Download File Destination - -You can also provide a `DownloadFileDestination` closure to move the file from the temporary directory to a final destination. Before the temporary file is actually moved to the `destinationURL`, the `DownloadOptions` specified in the closure will be executed. 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. - -```swift -let destination: DownloadRequest.DownloadFileDestination = { _, _ in - let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] - let fileURL = documentsURL.appendPathComponent("pig.png") - - return (fileURL, [.removePreviousFile, .createIntermediateDirectories]) -} - -Alamofire.download(urlString, to: destination).response { response in - print(response) - - if response.error == nil, let imagePath = response.destinationURL?.path { - let image = UIImage(contentsOfFile: imagePath) - } -} -``` - -You can also use the suggested download destination API. - -```swift -let destination = DownloadRequest.suggestedDownloadDestination(directory: .documentDirectory) -Alamofire.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 -Alamofire.download("https://httpbin.org/image/png") - .downloadProgress { progress in - print("Download Progress: \(progress.fractionCompleted)") - } - .responseData { response in - if let data = response.result.value { - let image = UIImage(data: data) - } - } -``` - -The `downloadProgress` API also takes a `queue` parameter which defines which `DispatchQueue` the download progress closure should be called on. - -```swift -let utilityQueue = DispatchQueue.global(qos: .utility) - -Alamofire.download("https://httpbin.org/image/png") - .downloadProgress(queue: utilityQueue) { progress in - print("Download Progress: \(progress.fractionCompleted)") - } - .responseData { response in - if let data = response.result.value { - let image = UIImage(data: data) - } - } -``` - -#### Resuming a Download - -If a `DownloadRequest` is cancelled or interrupted, the underlying URL session may generate resume data for the active `DownloadRequest`. If this happens, the resume data can be re-used to restart the `DownloadRequest` where it left off. The resume data can be accessed through the download response, then reused when trying to restart the request. - -> **IMPORTANT:** On the latest release of all the Apple platforms (iOS 10, macOS 10.12, tvOS 10, watchOS 3), `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 see this Stack Overflow [post](http://stackoverflow.com/a/39347461/1342462). - -```swift -class ImageRequestor { - private var resumeData: Data? - private var image: UIImage? - - func fetchImage(completion: (UIImage?) -> Void) { - guard image == nil else { completion(image) ; return } - - let destination: DownloadRequest.DownloadFileDestination = { _, _ in - let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] - let fileURL = documentsURL.appendPathComponent("pig.png") - - return (fileURL, [.removePreviousFile, .createIntermediateDirectories]) - } - - let request: DownloadRequest - - if let resumeData = resumeData { - request = Alamofire.download(resumingWith: resumeData) - } else { - request = Alamofire.download("https://httpbin.org/image/png") - } - - request.responseData { response in - switch response.result { - case .success(let data): - self.image = UIImage(data: data) - case .failure: - self.resumeData = response.resumeData - } - } - } -} -``` - -### Uploading Data to a Server - -When sending relatively small amounts of data to a server using JSON or URL encoded parameters, the `Alamofire.request` APIs are usually sufficient. If you need to send much larger amounts of data from a file URL or an `InputStream`, then the `Alamofire.upload` APIs are what you want to use. - -> The `Alamofire.upload` APIs should also be used if you need to upload data while your app is in the background. For more information, please see the [Session Manager Configurations](#session-manager) section. - -#### Uploading Data - -```swift -let imageData = UIPNGRepresentation(image)! - -Alamofire.upload(imageData, to: "https://httpbin.org/post").responseJSON { response in - debugPrint(response) -} -``` - -#### Uploading a File - -```swift -let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov") - -Alamofire.upload(fileURL, to: "https://httpbin.org/post").responseJSON { response in - debugPrint(response) -} -``` - -#### Uploading Multipart Form Data - -```swift -Alamofire.upload( - multipartFormData: { multipartFormData in - multipartFormData.append(unicornImageURL, withName: "unicorn") - multipartFormData.append(rainbowImageURL, withName: "rainbow") - }, - to: "https://httpbin.org/post", - encodingCompletion: { encodingResult in - switch encodingResult { - case .success(let upload, _, _): - upload.responseJSON { response in - debugPrint(response) - } - case .failure(let encodingError): - print(encodingError) - } - } -) -``` - -#### 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 and download progress of the response data using the `uploadProgress` and `downloadProgress` APIs. - -```swift -let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov") - -Alamofire.upload(fileURL, to: "https://httpbin.org/post") - .uploadProgress { progress in // main queue by default - print("Upload Progress: \(progress.fractionCompleted)") - } - .downloadProgress { progress in // main queue by default - print("Download Progress: \(progress.fractionCompleted)") - } - .responseJSON { response in - debugPrint(response) - } -``` - -### Statistical Metrics - -#### Timeline - -Alamofire collects timings throughout the lifecycle of a `Request` and creates a `Timeline` object exposed as a property on all response types. - -```swift -Alamofire.request("https://httpbin.org/get").responseJSON { response in - print(response.timeline) -} -``` - -The above reports the following `Timeline` info: - -- `Latency`: 0.428 seconds -- `Request Duration`: 0.428 seconds -- `Serialization Duration`: 0.001 seconds -- `Total Duration`: 0.429 seconds - -#### URL Session 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 the `Timeline`, but provides many more statistics that Alamofire doesn't have access to compute. The metrics can be accessed through any response type. - -```swift -Alamofire.request("https://httpbin.org/get").responseJSON { response in - print(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("https://httpbin.org/get").responseJSON { response in - if #available(iOS 10.0. *) { - print(response.metrics) - } -} -``` - -### cURL Command Output - -Debugging platform issues can be frustrating. Thankfully, Alamofire `Request` objects conform to both the `CustomStringConvertible` and `CustomDebugStringConvertible` protocols to provide some VERY helpful debugging tools. - -#### CustomStringConvertible - -```swift -let request = Alamofire.request("https://httpbin.org/ip") - -print(request) -// GET https://httpbin.org/ip (200) -``` +### Swift Package Manager -#### CustomDebugStringConvertible +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. It is in early development, but Alamofire does support its use on supported platforms. -```swift -let request = Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"]) -debugPrint(request) -``` - -Outputs: - -```bash -$ curl -i \ - -H "User-Agent: Alamofire/4.0.0" \ - -H "Accept-Encoding: gzip;q=1.0, compress;q=0.5" \ - -H "Accept-Language: en;q=1.0,fr;q=0.9,de;q=0.8,zh-Hans;q=0.7,zh-Hant;q=0.6,ja;q=0.5" \ - "https://httpbin.org/get?foo=bar" -``` - ---- - -## Advanced Usage - -Alamofire is built on `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/nsurlsession) -- [URLCache Class Reference](https://developer.apple.com/reference/foundation/urlcache) -- [URLAuthenticationChallenge Class Reference](https://developer.apple.com/reference/foundation/urlauthenticationchallenge) - -### Session Manager - -Top-level convenience methods like `Alamofire.request` use a default instance of `Alamofire.SessionManager`, which is configured with the default `URLSessionConfiguration`. - -As such, the following two statements are equivalent: - -```swift -Alamofire.request("https://httpbin.org/get") -``` - -```swift -let sessionManager = Alamofire.SessionManager.default -sessionManager.request("https://httpbin.org/get") -``` - -Applications can create session managers for background and ephemeral sessions, as well as new managers that customize the default session configuration, such as for default headers (`httpAdditionalHeaders`) or timeout interval (`timeoutIntervalForRequest`). - -#### Creating a Session Manager with Default Configuration - -```swift -let configuration = URLSessionConfiguration.default -let sessionManager = Alamofire.SessionManager(configuration: configuration) -``` - -#### Creating a Session Manager with Background Configuration - -```swift -let configuration = URLSessionConfiguration.background(withIdentifier: "com.example.app.background") -let sessionManager = Alamofire.SessionManager(configuration: configuration) -``` - -#### Creating a Session Manager with Ephemeral Configuration - -```swift -let configuration = URLSessionConfiguration.ephemeral -let sessionManager = Alamofire.SessionManager(configuration: configuration) -``` - -#### Modifying the Session Configuration - -```swift -var defaultHeaders = Alamofire.SessionManager.default.defaultHTTPHeaders -defaultHeaders["DNT"] = "1 (Do Not Track Enabled)" - -let configuration = URLSessionConfiguration.default -configuration.httpAdditionalHeaders = defaultHeaders - -let sessionManager = Alamofire.SessionManager(configuration: configuration) -``` - -> This is **not** recommended for `Authorization` or `Content-Type` headers. Instead, use the `headers` parameter in the top-level `Alamofire.request` APIs, `URLRequestConvertible` and `ParameterEncoding`, respectively. - -### Session Delegate - -By default, an Alamofire `SessionManager` instance creates a `SessionDelegate` object to handle all the various types of delegate callbacks that are generated by the underlying `URLSession`. The implementations of each delegate method handle the most common use cases for these types of calls abstracting the complexity away from the top-level APIs. However, advanced users may find the need to override the default functionality for various reasons. - -#### Override Closures - -The first way to customize the `SessionDelegate` behavior is through the use of the override closures. Each closure gives you the ability to override the implementation of the matching `SessionDelegate` API, yet still use the default implementation for all other APIs. This makes it easy to customize subsets of the delegate functionality. Here are a few examples of some of the override closures available: - -```swift -/// Overrides default behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)`. -open var sessionDidReceiveChallenge: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))? - -/// Overrides default behavior for URLSessionDelegate method `urlSessionDidFinishEvents(forBackgroundURLSession:)`. -open var sessionDidFinishEventsForBackgroundURLSession: ((URLSession) -> Void)? - -/// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)`. -open var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> URLRequest?)? - -/// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)`. -open var dataTaskWillCacheResponse: ((URLSession, URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)? -``` - -The following is a short example of how to use the `taskWillPerformHTTPRedirection` to avoid following redirects to any `apple.com` domains. - -```swift -let sessionManager = Alamofire.SessionManager(configuration: URLSessionConfiguration.default) -let delegate: Alamofire.SessionDelegate = sessionManager.delegate - -delegate.taskWillPerformHTTPRedirection = { session, task, response, request in - var finalRequest = request - - if - let originalRequest = task.originalRequest, - let urlString = originalRequest.url?.urlString, - urlString.contains("apple.com") - { - finalRequest = originalRequest - } - - return finalRequest -} -``` - -#### Subclassing - -Another way to override the default implementation of the `SessionDelegate` is to subclass it. Subclassing allows you completely customize the behavior of the API or to create a proxy for the API and still use the default implementation. Creating a proxy allows you to log events, emit notifications, provide pre and post hook implementations, etc. Here's a quick example of subclassing the `SessionDelegate` and logging a message when a redirect occurs. - -```swift -class LoggingSessionDelegate: SessionDelegate { - override func urlSession( - _ session: URLSession, - task: URLSessionTask, - willPerformHTTPRedirection response: HTTPURLResponse, - newRequest request: URLRequest, - completionHandler: @escaping (URLRequest?) -> Void) - { - print("URLSession will perform HTTP redirection to request: \(request)") - - super.urlSession( - session, - task: task, - willPerformHTTPRedirection: response, - newRequest: request, - completionHandler: completionHandler - ) - } -} -``` - -Generally speaking, either the default implementation or the override closures should provide the necessary functionality required. Subclassing should only be used as a last resort. - -> It is important to keep in mind that the `subdelegates` are initialized and destroyed in the default implementation. Be careful when subclassing to not introduce memory leaks. - -### Request - -The result of a `request`, `download`, `upload` or `stream` methods are a `DataRequest`, `DownloadRequest`, `UploadRequest` and `StreamRequest` which all inherit from `Request`. All `Request` instances are always created by an owning session manager, and never initialized directly. - -Each subclass has specialized methods such as `authenticate`, `validate`, `responseJSON` and `uploadProgress` that each return the caller instance in order to facilitate method chaining. - -Requests can be suspended, resumed and cancelled: - -- `suspend()`: Suspends the underlying task and dispatch queue. -- `resume()`: Resumes the underlying task and dispatch queue. If the owning manager does not have `startRequestsImmediately` set to `true`, the request must call `resume()` in order to start. -- `cancel()`: Cancels the underlying task, producing an error that is passed to any registered response handlers. - -### 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. - -#### 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/post" -Alamofire.request(urlString, method: .post) - -let url = URL(string: urlString)! -Alamofire.request(url, method: .post) - -let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) -Alamofire.request(.post, 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. - -##### Type-Safe Routing - -```swift -extension User: URLConvertible { - static let baseURLString = "https://example.com" - - func asURL() throws -> URL { - let urlString = User.baseURLString + "/users/\(username)/" - return try urlString.asURL() - } -} -``` - -```swift -let user = User(username: "mattt") -Alamofire.request(user) // https://example.com/users/mattt -``` - -#### URLRequestConvertible - -Types adopting the `URLRequestConvertible` protocol can be used to construct URL requests. `URLRequest` conforms to `URLRequestConvertible` by default, allowing it to be passed into `request`, `upload`, and `download` methods directly (this is the recommended way to specify custom HTTP body for individual requests): - -```swift -let url = URL(string: "https://httpbin.org/post")! -var urlRequest = URLRequest(url: url) -urlRequest.httpMethod = "POST" - -let parameters = ["foo": "bar"] - -do { - urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: []) -} catch { - // No-op -} - -urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") - -Alamofire.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 authentication credentials and other state. - -##### API Parameter Abstraction - -```swift -enum Router: URLRequestConvertible { - case search(query: String, page: Int) - - static let baseURLString = "https://example.com" - static let perPage = 50 - - // MARK: URLRequestConvertible - - func asURLRequest() throws -> URLRequest { - let result: (path: String, parameters: Parameters) = { - switch self { - case let .search(query, page) where page > 0: - return ("/search", ["q": query, "offset": Router.perPage * page]) - case let .search(query, _): - return ("/search", ["q": query]) - } - }() - - let url = try Router.baseURLString.asURL() - let urlRequest = URLRequest(url: url.appendingPathComponent(result.path)) - - return try URLEncoding.default.encode(urlRequest, with: result.parameters) - } -} -``` - -```swift -Alamofire.request(Router.search(query: "foo bar", page: 1)) // ?q=foo%20bar&offset=50 -``` - -##### CRUD & Authorization - -```swift -import Alamofire - -enum Router: URLRequestConvertible { - case createUser(parameters: Parameters) - case readUser(username: String) - case updateUser(username: String, parameters: Parameters) - case destroyUser(username: String) - - static let baseURLString = "https://example.com" - - var method: HTTPMethod { - switch self { - case .createUser: - return .post - case .readUser: - return .get - case .updateUser: - return .put - case .destroyUser: - return .delete - } - } - - var path: String { - switch self { - case .createUser: - return "/users" - case .readUser(let username): - return "/users/\(username)" - case .updateUser(let username, _): - return "/users/\(username)" - case .destroyUser(let username): - return "/users/\(username)" - } - } - - // MARK: URLRequestConvertible - - func asURLRequest() throws -> URLRequest { - let url = try Router.baseURLString.asURL() - - var urlRequest = URLRequest(url: url.appendingPathComponent(path)) - urlRequest.httpMethod = method.rawValue - - switch self { - case .createUser(let parameters): - urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters) - case .updateUser(_, let parameters): - urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters) - default: - break - } - - return urlRequest - } -} -``` - -```swift -Alamofire.request(Router.readUser("mattt")) // GET /users/mattt -``` - -### Adapting and Retrying Requests - -Most web services these days are behind some sort of authentication system. One of the more common ones today is OAuth. This generally involves generating an access token authorizing your application or user to call the various supported web services. While creating these initial access tokens can be laborsome, it can be even more complicated when your access token expires and you need to fetch a new one. There are many thread-safety issues that need to be considered. - -The `RequestAdapter` and `RequestRetrier` protocols were created to make it much easier to create a thread-safe authentication system for a specific set of web services. - -#### RequestAdapter - -The `RequestAdapter` protocol 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 - } -} -``` - -```swift -let sessionManager = SessionManager() -sessionManager.adapter = AccessTokenAdapter(accessToken: "1234") - -sessionManager.request("https://httpbin.org/get") -``` - -#### RequestRetrier - -The `RequestRetrier` protocol allows a `Request` that encountered an `Error` while being executed to 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. Here's an example of how you could implement a refresh flow for OAuth2 access tokens. - -> **DISCLAIMER:** This is **NOT** a global `OAuth2` solution. It is merely an example demonstrating how one could use the `RequestAdapter` in conjunction with the `RequestRetrier` to create a thread-safe refresh system. - -> To reiterate, **do NOT copy** this sample code and drop it into a production application. This is merely an example. Each authentication system must be tailored to a particular platform and authentication type. - -```swift -class OAuth2Handler: RequestAdapter, RequestRetrier { - private typealias RefreshCompletion = (_ succeeded: Bool, _ accessToken: String?, _ refreshToken: String?) -> Void - - private let sessionManager: SessionManager = { - let configuration = URLSessionConfiguration.default - configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders - - return SessionManager(configuration: configuration) - }() - - private let lock = NSLock() - - private var clientID: String - private var baseURLString: String - private var accessToken: String - private var refreshToken: String - - private var isRefreshing = false - private var requestsToRetry: [RequestRetryCompletion] = [] - - // MARK: - Initialization - - public init(clientID: String, baseURLString: String, accessToken: String, refreshToken: String) { - self.clientID = clientID - self.baseURLString = baseURLString - self.accessToken = accessToken - self.refreshToken = refreshToken - } - - // MARK: - RequestAdapter - - func adapt(_ urlRequest: URLRequest) throws -> URLRequest { - if let url = urlRequest.url, url.urlString.hasPrefix(baseURLString) { - var urlRequest = urlRequest - urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization") - return urlRequest - } - - return urlRequest - } - - // MARK: - RequestRetrier - - func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) { - lock.lock() ; defer { lock.unlock() } - - if let response = request.task.response as? HTTPURLResponse, response.statusCode == 401 { - requestsToRetry.append(completion) - - if !isRefreshing { - refreshTokens { [weak self] succeeded, accessToken, refreshToken in - guard let strongSelf = self else { return } - - strongSelf.lock.lock() ; defer { strongSelf.lock.unlock() } - - if let accessToken = accessToken, let refreshToken = refreshToken { - strongSelf.accessToken = accessToken - strongSelf.refreshToken = refreshToken - } - - strongSelf.requestsToRetry.forEach { $0(succeeded, 0.0) } - strongSelf.requestsToRetry.removeAll() - } - } - } else { - completion(false, 0.0) - } - } - - // MARK: - Private - Refresh Tokens - - private func refreshTokens(completion: @escaping RefreshCompletion) { - guard !isRefreshing else { return } - - isRefreshing = true - - let urlString = "\(baseURLString)/oauth2/token" - - let parameters: [String: Any] = [ - "access_token": accessToken, - "refresh_token": refreshToken, - "client_id": clientID, - "grant_type": "refresh_token" - ] - - sessionManager.request(urlString, method: .post, parameters: parameters, encoding: JSONEncoding.default) - .responseJSON { [weak self] response in - guard let strongSelf = self else { return } - - if - let json = response.result.value as? [String: Any], - let accessToken = json["access_token"] as? String, - let refreshToken = json["refresh_token"] as? String - { - completion(true, accessToken, refreshToken) - } else { - completion(false, nil, nil) - } - - strongSelf.isRefreshing = false - } - } -} -``` - -```swift -let baseURLString = "https://some.domain-behind-oauth2.com" - -let oauthHandler = OAuth2Handler( - clientID: "12345678", - baseURLString: baseURLString, - accessToken: "abcd1234", - refreshToken: "ef56789a" -) - -let sessionManager = SessionManager() -sessionManager.adapter = oauthHandler -sessionManager.retrier = oauthHandler - -let urlString = "\(baseURLString)/some/endpoint" - -sessionManager.request(urlString).validate().responseJSON { response in - debugPrint(response) -} -``` - -Once the `OAuth2Handler` is applied as both the `adapter` and `retrier` for the `SessionManager`, it will handle an invalid access token error by automatically refreshing the access token and retrying all failed requests in the same order they failed. - -> If you needed them to execute in the same order they were created, you could sort them by their task identifiers. - -The example above only checks for a `401` response code which is not nearly robust enough, but does demonstrate how one could check for an invalid access token error. In a production application, one would want to check the `realm` and most likely the `www-authenticate` header response although it depends on the OAuth2 implementation. - -Another important note is that this authentication system could be shared between multiple session managers. For example, you may need to use both a `default` and `ephemeral` session configuration for the same set of web services. The example above allows the same `oauthHandler` instance to be shared across multiple session managers to manage the single refresh flow. - -### Custom Response Serialization - -#### Handling Errors - -Before implementing custom response serializers or object serialization methods, it's important to consider how to handle any errors that may occur. There are two basic options: passing existing errors along unmodified, to be dealt with at response time; or, wrapping all errors in an `Error` type specific to your app. - -For example, here's a simple `BackendError` enum which will be used in later examples: - -```swift -enum BackendError: Error { - case network(error: Error) // Capture any underlying Error from the URLSession API - case dataSerialization(error: Error) - case jsonSerialization(error: Error) - case xmlSerialization(error: Error) - case objectSerialization(reason: String) -} -``` - -#### Creating a Custom Response Serializer - -Alamofire provides built-in response serialization for strings, JSON, and property lists, but others can be added in extensions on `Alamofire.DataRequest` and / or `Alamofire.DownloadRequest`. - -For example, here's how a response handler using [Ono](https://github.com/mattt/Ono) might be implemented: - -```swift -extension DataRequest { - static func xmlResponseSerializer() -> DataResponseSerializer { - return DataResponseSerializer { request, response, data, error in - // Pass through any underlying URLSession error to the .network case. - guard error == nil else { return .failure(BackendError.network(error: error!)) } - - // Use Alamofire's existing data serializer to extract the data, passing the error as nil, as it has - // already been handled. - let result = Request.serializeResponseData(response: response, data: data, error: nil) - - guard case let .success(validData) = result else { - return .failure(BackendError.dataSerialization(error: result.error! as! AFError)) - } - - do { - let xml = try ONOXMLDocument(data: validData) - return .success(xml) - } catch { - return .failure(BackendError.xmlSerialization(error: error)) - } - } - } - - @discardableResult - func responseXMLDocument( - queue: DispatchQueue? = nil, - completionHandler: @escaping (DataResponse) -> Void) - -> Self - { - return response( - queue: queue, - responseSerializer: DataRequest.xmlResponseSerializer(), - completionHandler: completionHandler - ) - } -} -``` - -#### Generic Response Object Serialization - -Generics can be used to provide automatic, type-safe response object serialization. - -```swift -protocol ResponseObjectSerializable { - init?(response: HTTPURLResponse, representation: Any) -} - -extension DataRequest { - func responseObject( - queue: DispatchQueue? = nil, - completionHandler: @escaping (DataResponse) -> Void) - -> Self - { - let responseSerializer = DataResponseSerializer { request, response, data, error in - guard error == nil else { return .failure(BackendError.network(error: error!)) } - - let jsonResponseSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments) - let result = jsonResponseSerializer.serializeResponse(request, response, data, nil) - - guard case let .success(jsonObject) = result else { - return .failure(BackendError.jsonSerialization(error: result.error!)) - } - - guard let response = response, let responseObject = T(response: response, representation: jsonObject) else { - return .failure(BackendError.objectSerialization(reason: "JSON could not be serialized: \(jsonObject)")) - } - - return .success(responseObject) - } - - return response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler) - } -} -``` - -```swift -struct User: ResponseObjectSerializable, CustomStringConvertible { - let username: String - let name: String - - var description: String { - return "User: { username: \(username), name: \(name) }" - } - - init?(response: HTTPURLResponse, representation: Any) { - guard - let username = response.url?.lastPathComponent, - let representation = representation as? [String: Any], - let name = representation["name"] as? String - else { return nil } - - self.username = username - self.name = name - } -} -``` - -```swift -Alamofire.request("https://example.com/users/mattt").responseObject { (response: DataResponse) in - debugPrint(response) - - if let user = response.result.value { - print("User: { username: \(user.username), name: \(user.name) }") - } -} -``` - -The same approach can also be used to handle endpoints that return a representation of a collection of objects: +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 -protocol ResponseCollectionSerializable { - static func collection(from response: HTTPURLResponse, withRepresentation representation: Any) -> [Self] -} - -extension ResponseCollectionSerializable where Self: ResponseObjectSerializable { - static func collection(from response: HTTPURLResponse, withRepresentation representation: Any) -> [Self] { - var collection: [Self] = [] - - if let representation = representation as? [[String: Any]] { - for itemRepresentation in representation { - if let item = Self(response: response, representation: itemRepresentation) { - collection.append(item) - } - } - } - - return collection - } -} -``` - -```swift -extension DataRequest { - @discardableResult - func responseCollection( - queue: DispatchQueue? = nil, - completionHandler: @escaping (DataResponse<[T]>) -> Void) -> Self - { - let responseSerializer = DataResponseSerializer<[T]> { request, response, data, error in - guard error == nil else { return .failure(BackendError.network(error: error!)) } - - let jsonSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments) - let result = jsonSerializer.serializeResponse(request, response, data, nil) - - guard case let .success(jsonObject) = result else { - return .failure(BackendError.jsonSerialization(error: result.error!)) - } - - guard let response = response else { - let reason = "Response collection could not be serialized due to nil response." - return .failure(BackendError.objectSerialization(reason: reason)) - } - - return .success(T.collection(from: response, withRepresentation: jsonObject)) - } - - return response(responseSerializer: responseSerializer, completionHandler: completionHandler) - } -} -``` - -```swift -struct User: ResponseObjectSerializable, ResponseCollectionSerializable, CustomStringConvertible { - let username: String - let name: String - - var description: String { - return "User: { username: \(username), name: \(name) }" - } - - init?(response: HTTPURLResponse, representation: Any) { - guard - let username = response.url?.lastPathComponent, - let representation = representation as? [String: Any], - let name = representation["name"] as? String - else { return nil } - - self.username = username - self.name = name - } -} -``` - -```swift -Alamofire.request("https://example.com/users").responseCollection { (response: DataResponse<[User]>) in - debugPrint(response) - - if let users = response.result.value { - users.forEach { print("- \($0)") } - } -} -``` - -### Security - -Using a secure HTTPS connection when communicating with servers and web services is an important step in securing sensitive data. By default, Alamofire will evaluate the certificate chain provided by the server using Apple's built in validation provided by the Security framework. 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 the `ServerTrustPolicy`. - -#### ServerTrustPolicy - -The `ServerTrustPolicy` enumeration evaluates the server trust generally provided by an `URLAuthenticationChallenge` when connecting to a server over a secure HTTPS connection. +#### Swift 3 ```swift -let serverTrustPolicy = ServerTrustPolicy.pinCertificates( - certificates: ServerTrustPolicy.certificatesInBundle(), - validateCertificateChain: true, - validateHost: true -) -``` - -There are many different cases of server trust evaluation giving you complete control over the validation process: - -* `performDefaultEvaluation`: Uses the default server trust evaluation while allowing you to control whether to validate the host provided by the challenge. -* `pinCertificates`: 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. -* `pinPublicKeys`: 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. -* `disableEvaluation`: Disables all evaluation which in turn will always consider any server trust as valid. -* `customEvaluation`: Uses the associated closure to evaluate the validity of the server trust thus giving you complete control over the validation process. Use with caution. - -#### Server Trust Policy Manager - -The `ServerTrustPolicyManager` is responsible for storing an internal mapping of server trust policies to a particular host. This allows Alamofire to evaluate each host against a different server trust policy. - -```swift -let serverTrustPolicies: [String: ServerTrustPolicy] = [ - "test.example.com": .pinCertificates( - certificates: ServerTrustPolicy.certificatesInBundle(), - validateCertificateChain: true, - validateHost: true - ), - "insecure.expired-apis.com": .disableEvaluation +dependencies: [ + .Package(url: "https://github.com/Alamofire/Alamofire.git", majorVersion: 4) ] - -let sessionManager = SessionManager( - serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies) -) ``` -> Make sure to keep a reference to the new `SessionManager` instance, otherwise your requests will all get cancelled when your `sessionManager` is deallocated. - -These server trust policies will result in the following behavior: - -- `test.example.com` will always use certificate pinning with certificate chain and host validation enabled thus requiring the following criteria to be met 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. -- `insecure.expired-apis.com` will never evaluate the certificate chain and will always allow the TLS handshake to succeed. -- All other hosts will use the default evaluation provided by Apple. - -##### Subclassing Server Trust Policy Manager - -If you find yourself needing more flexible server trust policy matching behavior (i.e. wildcarded domains), then subclass the `ServerTrustPolicyManager` and override the `serverTrustPolicyForHost` method with your own custom implementation. +#### Swift 4 ```swift -class CustomServerTrustPolicyManager: ServerTrustPolicyManager { - override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? { - var policy: ServerTrustPolicy? - - // Implement your custom domain matching behavior... - - return policy - } -} +dependencies: [ + .package(url: "https://github.com/Alamofire/Alamofire.git", from: "4.0.0") +] ``` -#### Validating the Host - -The `.performDefaultEvaluation`, `.pinCertificates` and `.pinPublicKeys` server trust policies all take a `validateHost` parameter. Setting the value to `true` will cause the server trust evaluation to verify that hostname in the certificate matches the hostname of the challenge. If they do not match, evaluation will fail. A `validateHost` value of `false` will still evaluate the full certificate chain, but will not validate the hostname of the leaf certificate. - -> It is recommended that `validateHost` always be set to `true` in production environments. - -#### Validating the Certificate Chain - -Pinning certificates and public keys both have the option of validating the certificate chain using the `validateCertificateChain` parameter. By setting this value to `true`, the full certificate chain will be evaluated in addition to performing a byte equality check against the pinned certificates or public keys. A value of `false` will skip the certificate chain validation, but will still perform the byte equality check. - -There are several cases where it may make sense to disable certificate chain validation. The most common use cases for disabling validation are self-signed and expired certificates. The evaluation would always fail in both of these cases, but the byte equality check will still ensure you are receiving the certificate you expect from the server. - -> It is recommended that `validateCertificateChain` always be set to `true` in production environments. - -#### App Transport Security - -With the addition of App Transport Security (ATS) in iOS 9, it is possible that using a custom `ServerTrustPolicyManager` with several `ServerTrustPolicy` 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. +### Manually -If you run into this problem (high probability with self-signed certificates), you can work around this issue by adding the following to your `Info.plist`. +If you prefer not to use any of the aforementioned dependency managers, you can integrate Alamofire into your project manually. -```xml - - NSAppTransportSecurity - - NSExceptionDomains - - example.com - - NSExceptionAllowsInsecureHTTPLoads - - NSExceptionRequiresForwardSecrecy - - NSIncludesSubdomains - - - NSTemporaryExceptionMinimumTLSVersion - TLSv1.2 - - - - -``` +#### Embedded Framework -Whether you need to set the `NSExceptionRequiresForwardSecrecy` to `NO` depends on whether your TLS connection is using an allowed cipher suite. In certain cases, it will need to be set to `NO`. The `NSExceptionAllowsInsecureHTTPLoads` MUST be set to `YES` in order to allow the `SessionDelegate` to receive challenge callbacks. Once the challenge callbacks are being called, the `ServerTrustPolicyManager` will take over the server trust evaluation. You may also need to specify the `NSTemporaryExceptionMinimumTLSVersion` if you're trying to connect to a host that only supports TLS versions less than `1.2`. +- 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: -> It is recommended to always use valid certificates in production environments. + ```bash + $ git init + ``` -### Network Reachability +- Add Alamofire as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command: -The `NetworkReachabilityManager` listens for reachability changes of hosts and addresses for both WWAN and WiFi network interfaces. + ```bash + $ git submodule add https://github.com/Alamofire/Alamofire.git + ``` -```swift -let manager = NetworkReachabilityManager(host: "www.apple.com") +- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project. -manager?.listener = { status in - print("Network Status Changed: \(status)") -} + > 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. -manager?.startListening() -``` +- 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. -> Make sure to remember to retain the `manager` in the above example, or no status changes will be reported. + > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`. -There are some important things to remember when using network reachability to determine what to do next. +- Select the top `Alamofire.framework` for iOS and the bottom one for OS X. -- **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." + > You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as either `Alamofire iOS`, `Alamofire macOS`, `Alamofire tvOS` or `Alamofire watchOS`. -> It is recommended to check out [WWDC 2012 Session 706, "Networking Best Practices"](https://developer.apple.com/videos/play/wwdc2012-706/) for more info. +- 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. ## 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 test case -- [`rdar://26761490`](http://www.openradar.me/radar?id=5010235949318144) - Swift string interpolation causing memory leak with common usage - `rdar://26870455` - Background URL Session Configurations do not work in the simulator - `rdar://26849668` - Some URLProtocol APIs do not properly handle `URLRequest` +- [`rdar://36082113`](http://openradar.appspot.com/radar?id=4942308441063424) - `URLSessionTaskMetrics` failing to link on watchOS 3.0+ + +## 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 on 9/1/17 in Xcode 9 beta 6). ## FAQ @@ -1721,8 +210,6 @@ Simple, static data such as paths, parameters and common headers belong in the ` The reason the dynamic data MUST be placed into the `RequestAdapter` is to support retry operations. When a `Request` is retried, the original request is not rebuilt meaning the `Router` will not be called again. The `RequestAdapter` is called again allowing the dynamic data to be updated on the original request before retrying the `Request`. ---- - ## 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. @@ -1733,18 +220,23 @@ If you believe you have identified a security vulnerability with Alamofire, you ## Donations -The [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially register as a federal non-profit organization. Registering will allow us members to gain some legal protections and also allow us to put donations to use, tax free. Donating to the ASF will enable us to: +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 us members to gain some legal protections and also allow us to put donations to use, tax free. +Donating to the ASF will enable us to: -- Pay our legal fees to register as a federal non-profit organization - 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. Our initial goal is to raise $1000 to get all our legal ducks in a row and kickstart this campaign. Any amount you can donate today to help us reach our goal would be greatly appreciated. +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 today to help us reach our goal would be greatly appreciated. -Click here to lend your support to: Alamofire Software Foundation and make a donation at pledgie.com ! +[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W34WPEE74APJQ) ## License -Alamofire is released under the MIT license. See LICENSE for details. +Alamofire is released under the MIT license. [See LICENSE](https://github.com/Alamofire/Alamofire/blob/master/LICENSE) for details. diff --git a/Pods/Alamofire/Source/AFError.swift b/Pods/Alamofire/Source/AFError.swift index f047695b..8b90d847 100644 --- a/Pods/Alamofire/Source/AFError.swift +++ b/Pods/Alamofire/Source/AFError.swift @@ -1,7 +1,7 @@ // // AFError.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 diff --git a/Pods/Alamofire/Source/Alamofire.swift b/Pods/Alamofire/Source/Alamofire.swift index 86d54d85..2fcc05ca 100644 --- a/Pods/Alamofire/Source/Alamofire.swift +++ b/Pods/Alamofire/Source/Alamofire.swift @@ -1,7 +1,7 @@ // // Alamofire.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -53,7 +53,7 @@ extension URL: URLConvertible { } extension URLComponents: URLConvertible { - /// Returns a URL if `url` is not nil, otherise throws an `Error`. + /// Returns a URL if `url` is not nil, otherwise throws an `Error`. /// /// - throws: An `AFError.invalidURL` if `url` is `nil`. /// diff --git a/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift b/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift index 5019d0d1..dea3ebc1 100644 --- a/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift +++ b/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift @@ -1,7 +1,7 @@ // // DispatchQueue+Alamofire.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -34,10 +34,4 @@ extension DispatchQueue { func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) { asyncAfter(deadline: .now() + delay, execute: closure) } - - func syncResult(_ closure: () -> T) -> T { - var result: T! - sync { result = closure() } - return result - } } diff --git a/Pods/Alamofire/Source/MultipartFormData.swift b/Pods/Alamofire/Source/MultipartFormData.swift index 1ce4d193..057e68b9 100644 --- a/Pods/Alamofire/Source/MultipartFormData.swift +++ b/Pods/Alamofire/Source/MultipartFormData.swift @@ -1,7 +1,7 @@ // // MultipartFormData.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -92,7 +92,7 @@ open class MultipartFormData { // MARK: - Properties /// The `Content-Type` header value containing the boundary used to generate the `multipart/form-data`. - open var contentType: String { return "multipart/form-data; boundary=\(boundary)" } + 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 { return bodyParts.reduce(0) { $0 + $1.bodyContentLength } } @@ -257,8 +257,7 @@ open class MultipartFormData { var isDirectory: ObjCBool = false let path = fileURL.path - guard FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) && !isDirectory.boolValue else - { + guard FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) && !isDirectory.boolValue else { setBodyPartError(withReason: .bodyPartFileIsDirectory(at: fileURL)) return } diff --git a/Pods/Alamofire/Source/NetworkReachabilityManager.swift b/Pods/Alamofire/Source/NetworkReachabilityManager.swift index c06a60e0..3ff2e7fc 100644 --- a/Pods/Alamofire/Source/NetworkReachabilityManager.swift +++ b/Pods/Alamofire/Source/NetworkReachabilityManager.swift @@ -1,7 +1,7 @@ // // NetworkReachabilityManager.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -34,16 +34,6 @@ import SystemConfiguration /// 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. - - - Unknown: It is unknown whether the network is reachable. - - NotReachable: The network is not reachable. - - ReachableOnWWAN: The network is reachable over the WWAN connection. - - ReachableOnWiFi: The network is reachable over the WiFi connection. - */ - - /// Defines the various states of network reachability. /// /// - unknown: It is unknown whether the network is reachable. @@ -91,7 +81,7 @@ open class NetworkReachabilityManager { /// A closure executed when the network reachability status changes. open var listener: Listener? - private var flags: SCNetworkReachabilityFlags? { + open var flags: SCNetworkReachabilityFlags? { var flags = SCNetworkReachabilityFlags() if SCNetworkReachabilityGetFlags(reachability, &flags) { @@ -102,7 +92,7 @@ open class NetworkReachabilityManager { } private let reachability: SCNetworkReachability - private var previousFlags: SCNetworkReachabilityFlags + open var previousFlags: SCNetworkReachabilityFlags // MARK: - Initialization @@ -192,21 +182,24 @@ open class NetworkReachabilityManager { // MARK: - Internal - Network Reachability Status func networkReachabilityStatusForFlags(_ flags: SCNetworkReachabilityFlags) -> NetworkReachabilityStatus { - guard flags.contains(.reachable) else { return .notReachable } + guard isNetworkReachable(with: flags) else { return .notReachable } - var networkStatus: NetworkReachabilityStatus = .notReachable + var networkStatus: NetworkReachabilityStatus = .reachable(.ethernetOrWiFi) - if !flags.contains(.connectionRequired) { networkStatus = .reachable(.ethernetOrWiFi) } + #if os(iOS) + if flags.contains(.isWWAN) { networkStatus = .reachable(.wwan) } + #endif - if flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic) { - if !flags.contains(.interventionRequired) { networkStatus = .reachable(.ethernetOrWiFi) } - } + return networkStatus + } - #if os(iOS) - if flags.contains(.isWWAN) { networkStatus = .reachable(.wwan) } - #endif + func isNetworkReachable(with flags: SCNetworkReachabilityFlags) -> Bool { + let isReachable = flags.contains(.reachable) + let needsConnection = flags.contains(.connectionRequired) + let canConnectAutomatically = flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic) + let canConnectWithoutUserInteraction = canConnectAutomatically && !flags.contains(.interventionRequired) - return networkStatus + return isReachable && (!needsConnection || canConnectWithoutUserInteraction) } } diff --git a/Pods/Alamofire/Source/Notifications.swift b/Pods/Alamofire/Source/Notifications.swift index 81f6e378..e1b61204 100644 --- a/Pods/Alamofire/Source/Notifications.swift +++ b/Pods/Alamofire/Source/Notifications.swift @@ -1,7 +1,7 @@ // // Notifications.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -48,5 +48,8 @@ extension Notification { public struct Key { /// User info dictionary key representing the `URLSessionTask` associated with the notification. public static let Task = "org.alamofire.notification.key.task" + + /// User info dictionary key representing the responseData associated with the notification. + public static let ResponseData = "org.alamofire.notification.key.responseData" } } diff --git a/Pods/Alamofire/Source/ParameterEncoding.swift b/Pods/Alamofire/Source/ParameterEncoding.swift index 242f6a83..4a54f2dd 100644 --- a/Pods/Alamofire/Source/ParameterEncoding.swift +++ b/Pods/Alamofire/Source/ParameterEncoding.swift @@ -1,7 +1,7 @@ // // ParameterEncoding.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -64,9 +64,15 @@ public protocol ParameterEncoding { /// 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`. Since there is no published specification for how to encode -/// collection types, 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`). +/// `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 @@ -82,6 +88,41 @@ public struct URLEncoding: ParameterEncoding { case methodDependent, queryString, httpBody } + /// 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. + /// - noBrackets: No brackets are appended. The key is encoded as is. + public enum ArrayEncoding { + case brackets, noBrackets + + func encode(key: String) -> String { + switch self { + case .brackets: + return "\(key)[]" + case .noBrackets: + return key + } + } + } + + /// Configures how `Bool` parameters are encoded. + /// + /// - numeric: Encode `true` as `1` and `false` as `0`. This is the default behavior. + /// - literal: Encode `true` and `false` as string literals. + public enum BoolEncoding { + case numeric, 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. @@ -99,15 +140,25 @@ public struct URLEncoding: ParameterEncoding { /// 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 a `URLEncoding` instance using the specified destination. /// /// - parameter destination: The destination defining where the encoded query string is to be applied. + /// - parameter arrayEncoding: The encoding to use for `Array` parameters. + /// - parameter boolEncoding: The encoding to use for `Bool` parameters. /// /// - returns: The new `URLEncoding` instance. - public init(destination: Destination = .methodDependent) { + public init(destination: Destination = .methodDependent, arrayEncoding: ArrayEncoding = .brackets, boolEncoding: BoolEncoding = .numeric) { self.destination = destination + self.arrayEncoding = arrayEncoding + self.boolEncoding = boolEncoding } // MARK: Encoding @@ -161,16 +212,16 @@ public struct URLEncoding: ParameterEncoding { } } else if let array = value as? [Any] { for value in array { - components += queryComponents(fromKey: "\(key)[]", value: value) + components += queryComponents(fromKey: arrayEncoding.encode(key: key), value: value) } } else if let value = value as? NSNumber { if value.isBool { - components.append((escape(key), escape((value.boolValue ? "1" : "0")))) + components.append((escape(key), escape(boolEncoding.encode(value: value.boolValue)))) } else { components.append((escape(key), escape("\(value)"))) } } else if let bool = value as? Bool { - components.append((escape(key), escape((bool ? "1" : "0")))) + components.append((escape(key), escape(boolEncoding.encode(value: bool)))) } else { components.append((escape(key), escape("\(value)"))) } @@ -223,9 +274,9 @@ public struct URLEncoding: ParameterEncoding { let endIndex = string.index(index, offsetBy: batchSize, limitedBy: string.endIndex) ?? string.endIndex let range = startIndex.. String { - var components = ["$ curl -i"] + var components = ["$ curl -v"] guard let request = self.request, let url = request.url, @@ -293,11 +293,12 @@ extension Request: CustomDebugStringConvertible { if let credentials = credentialStorage.credentials(for: protectionSpace)?.values { for credential in credentials { - components.append("-u \(credential.user!):\(credential.password!)") + guard let user = credential.user, let password = credential.password else { continue } + components.append("-u \(user):\(password)") } } else { - if let credential = delegate.credential { - components.append("-u \(credential.user!):\(credential.password!)") + if let credential = delegate.credential, let user = credential.user, let password = credential.password { + components.append("-u \(user):\(password)") } } } @@ -308,7 +309,12 @@ extension Request: CustomDebugStringConvertible { let cookies = cookieStorage.cookies(for: url), !cookies.isEmpty { let string = cookies.reduce("") { $0 + "\($1.name)=\($1.value);" } + + #if swift(>=3.2) + components.append("-b \"\(string[.. URLSessionTask { do { let urlRequest = try self.urlRequest.adapt(using: adapter) - return queue.syncResult { session.dataTask(with: urlRequest) } + return queue.sync { session.dataTask(with: urlRequest) } } catch { throw AdaptError(error: error) } @@ -459,9 +466,9 @@ open class DownloadRequest: Request { switch self { case let .request(urlRequest): let urlRequest = try urlRequest.adapt(using: adapter) - task = queue.syncResult { session.downloadTask(with: urlRequest) } + task = queue.sync { session.downloadTask(with: urlRequest) } case let .resumeData(resumeData): - task = queue.syncResult { session.downloadTask(withResumeData: resumeData) } + task = queue.sync { session.downloadTask(withResumeData: resumeData) } } return task @@ -564,13 +571,13 @@ open class UploadRequest: DataRequest { switch self { case let .data(data, urlRequest): let urlRequest = try urlRequest.adapt(using: adapter) - task = queue.syncResult { session.uploadTask(with: urlRequest, from: data) } + task = queue.sync { session.uploadTask(with: urlRequest, from: data) } case let .file(url, urlRequest): let urlRequest = try urlRequest.adapt(using: adapter) - task = queue.syncResult { session.uploadTask(with: urlRequest, fromFile: url) } + task = queue.sync { session.uploadTask(with: urlRequest, fromFile: url) } case let .stream(_, urlRequest): let urlRequest = try urlRequest.adapt(using: adapter) - task = queue.syncResult { session.uploadTask(withStreamedRequest: urlRequest) } + task = queue.sync { session.uploadTask(withStreamedRequest: urlRequest) } } return task @@ -634,9 +641,9 @@ open class StreamRequest: Request { switch self { case let .stream(hostName, port): - task = queue.syncResult { session.streamTask(withHostName: hostName, port: port) } + task = queue.sync { session.streamTask(withHostName: hostName, port: port) } case let .netService(netService): - task = queue.syncResult { session.streamTask(with: netService) } + task = queue.sync { session.streamTask(with: netService) } } return task diff --git a/Pods/Alamofire/Source/Response.swift b/Pods/Alamofire/Source/Response.swift index ba45f6b2..74b1ef54 100644 --- a/Pods/Alamofire/Source/Response.swift +++ b/Pods/Alamofire/Source/Response.swift @@ -1,7 +1,7 @@ // // Response.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -43,7 +43,23 @@ public struct DefaultDataResponse { var _metrics: AnyObject? - init(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?, timeline: Timeline = Timeline()) { + /// Creates a `DefaultDataResponse` instance from the specified parameters. + /// + /// - Parameters: + /// - request: The URL request sent to the server. + /// - response: The server's response to the URL request. + /// - data: The data returned by the server. + /// - error: The error encountered while executing or validating the request. + /// - timeline: The timeline of the complete lifecycle of the request. `Timeline()` by default. + /// - metrics: The task metrics containing the request / response statistics. `nil` by default. + public init( + request: URLRequest?, + response: HTTPURLResponse?, + data: Data?, + error: Error?, + timeline: Timeline = Timeline(), + metrics: AnyObject? = nil) + { self.request = request self.response = response self.data = data @@ -71,6 +87,12 @@ public struct DataResponse { /// The timeline of the complete lifecycle of the request. public let timeline: Timeline + /// Returns the associated value of the result if it is a success, `nil` otherwise. + public var value: Value? { return result.value } + + /// Returns the associated error value if the result if it is a failure, `nil` otherwise. + public var error: Error? { return result.error } + var _metrics: AnyObject? /// Creates a `DataResponse` instance with the specified parameters derived from response serialization. @@ -111,7 +133,7 @@ extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible { public var debugDescription: String { var output: [String] = [] - output.append(request != nil ? "[Request]: \(request!)" : "[Request]: nil") + output.append(request != nil ? "[Request]: \(request!.httpMethod ?? "GET") \(request!)" : "[Request]: nil") output.append(response != nil ? "[Response]: \(response!)" : "[Response]: nil") output.append("[Data]: \(data?.count ?? 0) bytes") output.append("[Result]: \(result.debugDescription)") @@ -123,6 +145,113 @@ extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible { // 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: (Value) -> T) -> DataResponse { + var response = DataResponse( + request: request, + response: self.response, + data: data, + result: result.map(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } + + /// Evaluates the given closure when the result of this `DataResponse` is a success, passing the unwrapped result + /// value as a parameter. + /// + /// Use the `flatMap` method with a closure that may throw an error. For example: + /// + /// let possibleData: DataResponse = ... + /// let possibleObject = possibleData.flatMap { + /// 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 flatMap(_ transform: (Value) throws -> T) -> DataResponse { + var response = DataResponse( + request: request, + response: self.response, + data: data, + result: result.flatMap(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } + + /// 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: (Error) -> E) -> DataResponse { + var response = DataResponse( + request: request, + response: self.response, + data: data, + result: result.mapError(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } + + /// Evaluates the specified closure when the `DataResponse` 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: DataResponse = ... + /// let possibleObject = possibleData.flatMapError { + /// 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 flatMapError(_ transform: (Error) throws -> E) -> DataResponse { + var response = DataResponse( + request: request, + response: self.response, + data: data, + result: result.flatMapError(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } +} + +// MARK: - + /// Used to store all data associated with an non-serialized response of a download request. public struct DefaultDownloadResponse { /// The URL request sent to the server. @@ -148,14 +277,26 @@ public struct DefaultDownloadResponse { var _metrics: AnyObject? - init( + /// Creates a `DefaultDownloadResponse` instance from the specified parameters. + /// + /// - Parameters: + /// - request: The URL request sent to the server. + /// - response: The server's response to the URL request. + /// - temporaryURL: The temporary destination URL of the data returned from the server. + /// - destinationURL: The final destination URL of the data returned from the server if it was moved. + /// - resumeData: The resume data generated if the request was cancelled. + /// - error: The error encountered while executing or validating the request. + /// - timeline: The timeline of the complete lifecycle of the request. `Timeline()` by default. + /// - metrics: The task metrics containing the request / response statistics. `nil` by default. + public init( request: URLRequest?, response: HTTPURLResponse?, temporaryURL: URL?, destinationURL: URL?, resumeData: Data?, error: Error?, - timeline: Timeline = Timeline()) + timeline: Timeline = Timeline(), + metrics: AnyObject? = nil) { self.request = request self.response = response @@ -192,6 +333,12 @@ public struct DownloadResponse { /// The timeline of the complete lifecycle of the request. public let timeline: Timeline + /// Returns the associated value of the result if it is a success, `nil` otherwise. + public var value: Value? { return result.value } + + /// Returns the associated error value if the result if it is a failure, `nil` otherwise. + public var error: Error? { return result.error } + var _metrics: AnyObject? /// Creates a `DownloadResponse` instance with the specified parameters derived from response serialization. @@ -239,7 +386,7 @@ extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertibl public var debugDescription: String { var output: [String] = [] - output.append(request != nil ? "[Request]: \(request!)" : "[Request]: nil") + output.append(request != nil ? "[Request]: \(request!.httpMethod ?? "GET") \(request!)" : "[Request]: nil") output.append(response != nil ? "[Response]: \(response!)" : "[Response]: nil") output.append("[TemporaryURL]: \(temporaryURL?.path ?? "nil")") output.append("[DestinationURL]: \(destinationURL?.path ?? "nil")") @@ -253,6 +400,121 @@ extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertibl // 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: (Value) -> T) -> DownloadResponse { + var response = DownloadResponse( + request: request, + response: self.response, + temporaryURL: temporaryURL, + destinationURL: destinationURL, + resumeData: resumeData, + result: result.map(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } + + /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped + /// result value as a parameter. + /// + /// Use the `flatMap` method with a closure that may throw an error. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let possibleObject = possibleData.flatMap { + /// 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 flatMap(_ transform: (Value) throws -> T) -> DownloadResponse { + var response = DownloadResponse( + request: request, + response: self.response, + temporaryURL: temporaryURL, + destinationURL: destinationURL, + resumeData: resumeData, + result: result.flatMap(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } + + /// 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: (Error) -> E) -> DownloadResponse { + var response = DownloadResponse( + request: request, + response: self.response, + temporaryURL: temporaryURL, + destinationURL: destinationURL, + resumeData: resumeData, + result: result.mapError(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } + + /// Evaluates the specified closure when the `DownloadResponse` 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: DownloadResponse = ... + /// let possibleObject = possibleData.flatMapError { + /// 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 flatMapError(_ transform: (Error) throws -> E) -> DownloadResponse { + var response = DownloadResponse( + request: request, + response: self.response, + temporaryURL: temporaryURL, + destinationURL: destinationURL, + resumeData: resumeData, + result: result.flatMapError(transform), + timeline: timeline + ) + + response._metrics = _metrics + + return response + } +} + +// MARK: - + protocol Response { /// The task metrics containing the request / response statistics. var _metrics: AnyObject? { get set } diff --git a/Pods/Alamofire/Source/ResponseSerialization.swift b/Pods/Alamofire/Source/ResponseSerialization.swift index 47780fd6..3333726d 100644 --- a/Pods/Alamofire/Source/ResponseSerialization.swift +++ b/Pods/Alamofire/Source/ResponseSerialization.swift @@ -1,7 +1,7 @@ // // ResponseSerialization.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -88,11 +88,12 @@ public struct DownloadResponseSerializer: DownloadResponseSerializerProto extension Request { var timeline: Timeline { + let requestStartTime = self.startTime ?? CFAbsoluteTimeGetCurrent() let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent() let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime return Timeline( - requestStartTime: self.startTime ?? CFAbsoluteTimeGetCurrent(), + requestStartTime: requestStartTime, initialResponseTime: initialResponseTime, requestCompletedTime: requestCompletedTime, serializationCompletedTime: CFAbsoluteTimeGetCurrent() @@ -367,13 +368,13 @@ extension Request { var convertedEncoding = encoding - if let encodingName = response?.textEncodingName as CFString!, convertedEncoding == nil { + if let encodingName = response?.textEncodingName as CFString?, convertedEncoding == nil { convertedEncoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding( CFStringConvertIANACharSetNameToEncoding(encodingName)) ) } - let actualEncoding = convertedEncoding ?? String.Encoding.isoLatin1 + let actualEncoding = convertedEncoding ?? .isoLatin1 if let string = String(data: validData, encoding: actualEncoding) { return .success(string) diff --git a/Pods/Alamofire/Source/Result.swift b/Pods/Alamofire/Source/Result.swift index 22933089..df62e12c 100644 --- a/Pods/Alamofire/Source/Result.swift +++ b/Pods/Alamofire/Source/Result.swift @@ -1,7 +1,7 @@ // // Result.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -100,3 +100,201 @@ extension Result: CustomDebugStringConvertible { } } } + +// MARK: - Functional APIs + +extension Result { + /// 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 + /// + /// The trailing closure syntax is also supported: + /// + /// let result = Result { try someString() } + /// + /// - parameter value: The closure to execute and create the result for. + public init(value: () throws -> Value) { + do { + self = try .success(value()) + } catch { + self = .failure(error) + } + } + + /// Returns the success value, or throws the failure error. + /// + /// let possibleString: Result = .success("success") + /// try print(possibleString.unwrap()) + /// // Prints "success" + /// + /// let noString: Result = .failure(error) + /// try print(noString.unwrap()) + /// // Throws error + public func unwrap() throws -> Value { + switch self { + case .success(let value): + return value + case .failure(let error): + throw error + } + } + + /// 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 = .success(Data()) + /// let possibleInt = possibleData.map { $0.count } + /// try print(possibleInt.unwrap()) + /// // Prints "0" + /// + /// let noData: Result = .failure(error) + /// let noInt = noData.map { $0.count } + /// try print(noInt.unwrap()) + /// // Throws error + /// + /// - parameter transform: A closure that takes the success value of the `Result` instance. + /// + /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the + /// same failure. + public func map(_ transform: (Value) -> T) -> Result { + switch self { + case .success(let value): + return .success(transform(value)) + case .failure(let error): + return .failure(error) + } + } + + /// 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 = .success(Data(...)) + /// let possibleObject = possibleData.flatMap { + /// 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. + public func flatMap(_ transform: (Value) throws -> T) -> Result { + switch self { + case .success(let value): + do { + return try .success(transform(value)) + } catch { + return .failure(error) + } + case .failure(let error): + return .failure(error) + } + } + + /// 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 = .failure(someError) + /// let withMyError: Result = possibleData.mapError { MyError.error($0) } + /// + /// - Parameter transform: A 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 instance. + public func mapError(_ transform: (Error) -> T) -> Result { + switch self { + case .failure(let error): + return .failure(transform(error)) + case .success: + return self + } + } + + /// 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 = .success(Data(...)) + /// let possibleObject = possibleData.flatMapError { + /// 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 instance. + public func flatMapError(_ transform: (Error) throws -> T) -> Result { + switch self { + case .failure(let error): + do { + return try .failure(transform(error)) + } catch { + return .failure(error) + } + case .success: + return self + } + } + + /// 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. + /// + /// - Parameter closure: A closure that takes the success value of this instance. + /// - Returns: This `Result` instance, unmodified. + @discardableResult + public func withValue(_ closure: (Value) -> Void) -> Result { + if case let .success(value) = self { closure(value) } + + return self + } + + /// 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. + /// + /// - Parameter closure: A closure that takes the success value of this instance. + /// - Returns: This `Result` instance, unmodified. + @discardableResult + public func withError(_ closure: (Error) -> Void) -> Result { + if case let .failure(error) = self { closure(error) } + + return self + } + + /// Evaluates the specified closure when the `Result` is a success. + /// + /// Use the `ifSuccess` function to evaluate the passed closure without modifying the `Result` instance. + /// + /// - Parameter closure: A `Void` closure. + /// - Returns: This `Result` instance, unmodified. + @discardableResult + public func ifSuccess(_ closure: () -> Void) -> Result { + if isSuccess { closure() } + + return self + } + + /// Evaluates the specified closure when the `Result` is a failure. + /// + /// Use the `ifFailure` function to evaluate the passed closure without modifying the `Result` instance. + /// + /// - Parameter closure: A `Void` closure. + /// - Returns: This `Result` instance, unmodified. + @discardableResult + public func ifFailure(_ closure: () -> Void) -> Result { + if isFailure { closure() } + + return self + } +} diff --git a/Pods/Alamofire/Source/ServerTrustPolicy.swift b/Pods/Alamofire/Source/ServerTrustPolicy.swift index 4d5030f5..a644ad85 100644 --- a/Pods/Alamofire/Source/ServerTrustPolicy.swift +++ b/Pods/Alamofire/Source/ServerTrustPolicy.swift @@ -1,7 +1,7 @@ // // ServerTrustPolicy.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -88,6 +88,13 @@ extension URLSession { /// validate the host in production environments to guarantee the validity of the server's /// certificate chain. /// +/// - performRevokedEvaluation: 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. +/// /// - pinCertificates: 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 @@ -107,6 +114,7 @@ extension URLSession { /// - customEvaluation: Uses the associated closure to evaluate the validity of the server trust. public enum ServerTrustPolicy { case performDefaultEvaluation(validateHost: Bool) + case performRevokedEvaluation(validateHost: Bool, revocationFlags: CFOptionFlags) case pinCertificates(certificates: [SecCertificate], validateCertificateChain: Bool, validateHost: Bool) case pinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool) case disableEvaluation @@ -171,6 +179,12 @@ public enum ServerTrustPolicy { let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil) SecTrustSetPolicies(serverTrust, policy) + serverTrustIsValid = trustIsValid(serverTrust) + case let .performRevokedEvaluation(validateHost, revocationFlags): + let defaultPolicy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil) + let revokedPolicy = SecPolicyCreateRevocation(revocationFlags) + SecTrustSetPolicies(serverTrust, [defaultPolicy, revokedPolicy] as CFTypeRef) + serverTrustIsValid = trustIsValid(serverTrust) case let .pinCertificates(pinnedCertificates, validateCertificateChain, validateHost): if validateCertificateChain { diff --git a/Pods/Alamofire/Source/SessionDelegate.swift b/Pods/Alamofire/Source/SessionDelegate.swift index f40bf89d..03bcb7ce 100644 --- a/Pods/Alamofire/Source/SessionDelegate.swift +++ b/Pods/Alamofire/Source/SessionDelegate.swift @@ -1,7 +1,7 @@ // // SessionDelegate.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -36,7 +36,7 @@ open class SessionDelegate: NSObject { open var sessionDidReceiveChallenge: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))? /// Overrides all behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)` and requires the caller to call the `completionHandler`. - open var sessionDidReceiveChallengeWithCompletion: ((URLSession, URLAuthenticationChallenge, (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)? + open var sessionDidReceiveChallengeWithCompletion: ((URLSession, URLAuthenticationChallenge, @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)? /// Overrides default behavior for URLSessionDelegate method `urlSessionDidFinishEvents(forBackgroundURLSession:)`. open var sessionDidFinishEventsForBackgroundURLSession: ((URLSession) -> Void)? @@ -48,21 +48,21 @@ open class SessionDelegate: NSObject { /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` and /// requires the caller to call the `completionHandler`. - open var taskWillPerformHTTPRedirectionWithCompletion: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest, (URLRequest?) -> Void) -> Void)? + open var taskWillPerformHTTPRedirectionWithCompletion: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest, @escaping (URLRequest?) -> Void) -> Void)? /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didReceive:completionHandler:)`. open var taskDidReceiveChallenge: ((URLSession, URLSessionTask, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))? /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:didReceive:completionHandler:)` and /// requires the caller to call the `completionHandler`. - open var taskDidReceiveChallengeWithCompletion: ((URLSession, URLSessionTask, URLAuthenticationChallenge, (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)? + open var taskDidReceiveChallengeWithCompletion: ((URLSession, URLSessionTask, URLAuthenticationChallenge, @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)? /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:needNewBodyStream:)`. open var taskNeedNewBodyStream: ((URLSession, URLSessionTask) -> InputStream?)? /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:needNewBodyStream:)` and /// requires the caller to call the `completionHandler`. - open var taskNeedNewBodyStreamWithCompletion: ((URLSession, URLSessionTask, (InputStream?) -> Void) -> Void)? + open var taskNeedNewBodyStreamWithCompletion: ((URLSession, URLSessionTask, @escaping (InputStream?) -> Void) -> Void)? /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)`. open var taskDidSendBodyData: ((URLSession, URLSessionTask, Int64, Int64, Int64) -> Void)? @@ -77,7 +77,7 @@ open class SessionDelegate: NSObject { /// Overrides all behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didReceive:completionHandler:)` and /// requires caller to call the `completionHandler`. - open var dataTaskDidReceiveResponseWithCompletion: ((URLSession, URLSessionDataTask, URLResponse, (URLSession.ResponseDisposition) -> Void) -> Void)? + open var dataTaskDidReceiveResponseWithCompletion: ((URLSession, URLSessionDataTask, URLResponse, @escaping (URLSession.ResponseDisposition) -> Void) -> Void)? /// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didBecome:)`. open var dataTaskDidBecomeDownloadTask: ((URLSession, URLSessionDataTask, URLSessionDownloadTask) -> Void)? @@ -90,7 +90,7 @@ open class SessionDelegate: NSObject { /// Overrides all behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)` and /// requires caller to call the `completionHandler`. - open var dataTaskWillCacheResponseWithCompletion: ((URLSession, URLSessionDataTask, CachedURLResponse, (CachedURLResponse?) -> Void) -> Void)? + open var dataTaskWillCacheResponseWithCompletion: ((URLSession, URLSessionDataTask, CachedURLResponse, @escaping (CachedURLResponse?) -> Void) -> Void)? // MARK: URLSessionDownloadDelegate Overrides @@ -163,7 +163,7 @@ open class SessionDelegate: NSObject { var retrier: RequestRetrier? weak var sessionManager: SessionManager? - private var requests: [Int: Request] = [:] + var requests: [Int: Request] = [:] private let lock = NSLock() /// Access the task delegate for the specified task in a thread-safe manner. @@ -438,16 +438,20 @@ extension SessionDelegate: URLSessionTaskDelegate { let completeTask: (URLSession, URLSessionTask, Error?) -> Void = { [weak self] session, task, error in guard let strongSelf = self else { return } - if let taskDidComplete = strongSelf.taskDidComplete { - taskDidComplete(session, task, error) - } else if let delegate = strongSelf[task]?.delegate { - delegate.urlSession(session, task: task, didCompleteWithError: error) + strongSelf.taskDidComplete?(session, task, error) + + strongSelf[task]?.delegate.urlSession(session, task: task, didCompleteWithError: error) + + var userInfo: [String: Any] = [Notification.Key.Task: task] + + if let data = (strongSelf[task]?.delegate as? DataTaskDelegate)?.data { + userInfo[Notification.Key.ResponseData] = data } NotificationCenter.default.post( name: Notification.Name.Task.DidComplete, object: strongSelf, - userInfo: [Notification.Key.Task: task] + userInfo: userInfo ) strongSelf[task] = nil @@ -464,17 +468,17 @@ extension SessionDelegate: URLSessionTaskDelegate { // Determine whether an error has occurred var error: Error? = error - if let taskDelegate = self[task]?.delegate, taskDelegate.error != nil { - error = taskDelegate.error + if request.delegate.error != nil { + error = request.delegate.error } /// If an error occurred and the retrier is set, asynchronously ask the retrier if the request /// should be retried. Otherwise, complete the task by notifying the task delegate. if let retrier = retrier, let error = error { - retrier.should(sessionManager, retry: request, with: error) { [weak self] shouldRetry, delay in + retrier.should(sessionManager, retry: request, with: error) { [weak self] shouldRetry, timeDelay in guard shouldRetry else { completeTask(session, task, error) ; return } - DispatchQueue.utility.after(delay) { [weak self] in + DispatchQueue.utility.after(timeDelay) { [weak self] in guard let strongSelf = self else { return } let retrySucceeded = strongSelf.sessionManager?.retry(request) ?? false diff --git a/Pods/Alamofire/Source/SessionManager.swift b/Pods/Alamofire/Source/SessionManager.swift index 2984033d..a9d0ae68 100644 --- a/Pods/Alamofire/Source/SessionManager.swift +++ b/Pods/Alamofire/Source/SessionManager.swift @@ -1,7 +1,7 @@ // // SessionManager.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -249,6 +249,7 @@ open class SessionManager { /// - parameter urlRequest: The URL request. /// /// - returns: The created `DataRequest`. + @discardableResult open func request(_ urlRequest: URLRequestConvertible) -> DataRequest { var originalRequest: URLRequest? @@ -847,6 +848,10 @@ open class SessionManager { do { let task = try originalTask.task(session: session, adapter: adapter, queue: queue) + if let originalTask = request.task { + delegate[originalTask] = nil // removes the old request to avoid endless growth + } + request.delegate.task = task // resets all task delegate data request.retryCount += 1 @@ -874,12 +879,16 @@ open class SessionManager { return } - let retrySucceeded = strongSelf.retry(request) + DispatchQueue.utility.after(timeDelay) { + guard let strongSelf = self else { return } - if retrySucceeded, let task = request.task { - strongSelf.delegate[task] = request - } else { - if strongSelf.startRequestsImmediately { request.resume() } + let retrySucceeded = strongSelf.retry(request) + + if retrySucceeded, let task = request.task { + strongSelf.delegate[task] = request + } else { + if strongSelf.startRequestsImmediately { request.resume() } + } } } } diff --git a/Pods/Alamofire/Source/TaskDelegate.swift b/Pods/Alamofire/Source/TaskDelegate.swift index d4fd2163..1d537eaa 100644 --- a/Pods/Alamofire/Source/TaskDelegate.swift +++ b/Pods/Alamofire/Source/TaskDelegate.swift @@ -1,7 +1,7 @@ // // TaskDelegate.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -40,17 +40,30 @@ open class TaskDelegate: NSObject { public var error: Error? var task: URLSessionTask? { - didSet { reset() } + set { + taskLock.lock(); defer { taskLock.unlock() } + _task = newValue + } + get { + taskLock.lock(); defer { taskLock.unlock() } + return _task + } } var initialResponseTime: CFAbsoluteTime? var credential: URLCredential? var metrics: AnyObject? // URLSessionTaskMetrics + private var _task: URLSessionTask? { + didSet { reset() } + } + + private let taskLock = NSLock() + // MARK: Lifecycle init(task: URLSessionTask?) { - self.task = task + _task = task self.queue = { let operationQueue = OperationQueue() diff --git a/Pods/Alamofire/Source/Timeline.swift b/Pods/Alamofire/Source/Timeline.swift index 1440989d..181c9883 100644 --- a/Pods/Alamofire/Source/Timeline.swift +++ b/Pods/Alamofire/Source/Timeline.swift @@ -1,7 +1,7 @@ // // Timeline.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 diff --git a/Pods/Alamofire/Source/Validation.swift b/Pods/Alamofire/Source/Validation.swift index c405d02a..ec2c5c35 100644 --- a/Pods/Alamofire/Source/Validation.swift +++ b/Pods/Alamofire/Source/Validation.swift @@ -1,7 +1,7 @@ // // Validation.swift // -// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// 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 @@ -48,7 +48,13 @@ extension Request { init?(_ string: String) { let components: [String] = { let stripped = string.trimmingCharacters(in: .whitespacesAndNewlines) + + #if swift(>=3.2) + let split = stripped[..<(stripped.range(of: ";")?.lowerBound ?? stripped.endIndex)] + #else let split = stripped.substring(to: stripped.range(of: ";")?.lowerBound ?? stripped.endIndex) + #endif + return split.components(separatedBy: "/") }() diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 1c817224..d2046955 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,30 +1,30 @@ PODS: - - Alamofire (4.2.0) + - Alamofire (4.7.2) - BRLOptionParser (0.3.1) - GCDWebServer (3.4.2): - GCDWebServer/Core (= 3.4.2) - GCDWebServer/Core (3.4.2) - MASShortcut (2.3.6) - - RxCocoa (3.6.1): - - RxSwift (~> 3.6) - - RxSwift (3.6.1) + - RxCocoa (4.1.2): + - RxSwift (~> 4.0) + - RxSwift (4.1.2) DEPENDENCIES: - - Alamofire (~> 4.2.0) + - Alamofire (~> 4.7.2) - BRLOptionParser (~> 0.3.1) - GCDWebServer (~> 3.0) - MASShortcut (~> 2) - - RxCocoa (~> 3.0) - - RxSwift (~> 3.0) + - RxCocoa (~> 4.1.2) + - RxSwift (~> 4.1.2) SPEC CHECKSUMS: - Alamofire: aa2e09d871c9160ac53c90e83c68064a94e3dfbe + Alamofire: e4fa87002c137ba2d8d634d2c51fabcda0d5c223 BRLOptionParser: a03256a8ff003ca1f5376c55f55f210e085a3958 GCDWebServer: 8d67ee9f634b4bb91eb4b8aee440318a5fc6debd MASShortcut: 9c215e8a8a78f3d01ce56da48e2730ab66b538fa - RxCocoa: 84a08739ab186248c7f31ce4ee92d6f8a947d690 - RxSwift: f9de85ea20cd2f7716ee5409fc13523dc638e4e4 + RxCocoa: d88ba0f1f6abf040011a9eb4b539324fc426843a + RxSwift: e49536837d9901277638493ea537394d4b55f570 -PODFILE CHECKSUM: 5abdd116651e99453ca2480b0a17344fadc111ea +PODFILE CHECKSUM: 00940d7054f9c0a5f67a7f3be8edb28676d11545 -COCOAPODS: 1.3.1 +COCOAPODS: 1.4.0 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 26c445b0..e346dcb3 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -8,319 +8,331 @@ /* Begin PBXBuildFile section */ 008D88E94858B0B8190DD42951253AD2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 0093F7D38FC7D85465CC3D99E967DEBD /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B348F108925962F83EAEAC0E334CA06 /* SingleAsync.swift */; }; - 00D5F4580CB36DEEDCD9993C7AB12FC6 /* BooleanDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534E4A964C49209EE277E82628F5710B /* BooleanDisposable.swift */; }; - 015A2D47B6DA8E170E4E64108EC177CA /* GCDWebServerFileRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = C952CFCB4CF5FD55CFE8949FD41C9460 /* GCDWebServerFileRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 02AF6FE5E8DEE90F98111F7EA2A3C4E0 /* RxSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 33607CFF1CB9E42C89084F9C17E407B0 /* RxSwift-dummy.m */; }; - 034E2CE53A5F556A85666E0818BF3717 /* Take.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13E44E93931EFF87E67F113CD862A0C1 /* Take.swift */; }; - 03810806C0578A750613717248DC37CC /* GCDWebServerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = E5B859D5878DCF98B3D01C2C0615A78C /* GCDWebServerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 0551162B7568A0F3028CF7CE13E9C1C7 /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D03BE981ABF583B8C0A9733FC4E7758 /* GCDWebServerURLEncodedFormRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 079EF148723928859C047C3138DE0803 /* SynchronizedSubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C5253CFC07A13DD0519ACE57BC0EC0 /* SynchronizedSubscribeType.swift */; }; - 07CC568506C88350F3D06C8D5E01FBE3 /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D5F30FE87A96D7AA09249DB4D8F82F /* SerialDisposable.swift */; }; - 08067F41CEECB56CE74FFCA481092E8D /* RxCocoaRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = D184A55F942880B696653A33913ECF93 /* RxCocoaRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0831DDBAFF287B622A0E7BF2F07067EC /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02C96012B347BB2E33A987A213CA57C4 /* ObserveOn.swift */; }; - 087BC98FF9D82DC970EFDBEC0EB2F630 /* PrimitiveSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6873049F56F58D5ED3E44719FC73C4F6 /* PrimitiveSequence.swift */; }; - 098AA417A5494FC829E777DC5CF06ECC /* GCDWebServerURLEncodedFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = FD0A0C898D69E818B6F386B2CBA9012F /* GCDWebServerURLEncodedFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0A402C97D8A2855E4F69D8E2BFEE752E /* BRLOptionParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 78481FCBF09A8942C2BCB258298EBDBE /* BRLOptionParser.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 0B8140968914C908CFB4949F67745DD7 /* GCDWebServerFileResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 09187F1FBD16DDE0A198691271E6D322 /* GCDWebServerFileResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0C2489F5F28E8C78A5C0F2ACC9417BB8 /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4632B46CC78EF8030FEB67D2D7C92DE /* Reduce.swift */; }; - 0E647DAEE0FA9B09AB44F2FC7F783AF6 /* InvocableScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A7049C5EA5CF2C54BDD0F1BE4D6FCD /* InvocableScheduledItem.swift */; }; - 0EEDED92446E48374613587144395686 /* Merge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D1CCFB65C786E25702F68A5601E80DC /* Merge.swift */; }; - 1053278298D8F300576B4D665571E9AE /* SubscriptionDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCF0DD57FB4E2DED2BA043D232A8F3E9 /* SubscriptionDisposable.swift */; }; - 10B733D4847215A070C8DA610FEB341A /* CombineLatest+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183021AC8ED6060D003674388D5B1B49 /* CombineLatest+Collection.swift */; }; - 10EB23E9ECC4B33E16933BB1EA560B6A /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8AAFB037FDFF7437E3006151BA5FE9B /* Timeline.swift */; }; - 12149EA10608B7DE38879E6242D2826C /* ko.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2255320841E837341A064E1387C85F85 /* ko.lproj */; }; - 122FFB4B36FA3F74072A453832F84ECE /* _RX.m in Sources */ = {isa = PBXBuildFile; fileRef = EBBFBC78787B38998069A1A51FB6277B /* _RX.m */; }; - 12AAA6C1CF57638AE521DCE56BED0135 /* Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E0880FB45B513CD4BFD63BB3E7B736 /* Catch.swift */; }; - 1406A68843A0616DE9575C7F1B318023 /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = E969B8C71DA98B913BC86FD4AC5574BD /* Window.swift */; }; - 1568BC317134F1902AB76EE65E0A18CE /* GCDWebServerDataResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A338EA0CA1FE047514C4AE30D1EC601 /* GCDWebServerDataResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 157AE1FBA8F6C3B710CDE90F86492010 /* MASShortcut.m in Sources */ = {isa = PBXBuildFile; fileRef = 535DA0E1B20533E30B48C0F04AEF67CD /* MASShortcut.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 15D984826F02EEAFBC745BD8AA44630A /* ScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58AB02263E99467FF2175C1702B5ED82 /* ScheduledItem.swift */; }; - 1824713806488E78A33A48AA7BE85A2C /* AnyObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61F3F1CC2095B445C811F0C16E005B49 /* AnyObserver.swift */; }; + 010E5C9355217455596792A83A1A86AD /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4E00A40F2D4DE3318F31F4BD19FC986 /* SubscribeOn.swift */; }; + 015A2D47B6DA8E170E4E64108EC177CA /* GCDWebServerFileRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = BEA567412780FF078C4F7D7AEEA21AD2 /* GCDWebServerFileRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 027E63B83CAF0C92F57B9AB56674EB04 /* GroupBy.swift in Sources */ = {isa = PBXBuildFile; fileRef = E18663B7E781172BDC6EFC5AC77BA4FF /* GroupBy.swift */; }; + 03810806C0578A750613717248DC37CC /* GCDWebServerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = BDAA1AF05A1F0B1B7C16588267607FE1 /* GCDWebServerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 04C0394D629A610FA6BE32906A9772C5 /* KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 284942F9AAC3AFDD49598A09EEBAF5FE /* KVORepresentable.swift */; }; + 0551162B7568A0F3028CF7CE13E9C1C7 /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = D27F9B49B02CDF00CFD1E0CF066445B2 /* GCDWebServerURLEncodedFormRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 05EFEC2BDEDBF30BF56C3F2DB0AE7A56 /* HistoricalScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28409654F83C1BED4A04990DF2A46117 /* HistoricalScheduler.swift */; }; + 0616475CEB33DAF817FA5A06022D5D7B /* Scan.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF846AE7A2DE452AE4DCDE6EFBEC8B26 /* Scan.swift */; }; + 06E53ABF634928697CF55B2D6DD415F4 /* Dematerialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87372668A1EA52537C962C8365145B96 /* Dematerialize.swift */; }; + 08067F41CEECB56CE74FFCA481092E8D /* RxCocoaRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FF66DB8174612DE3868CD61F0C25E75 /* RxCocoaRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 098AA417A5494FC829E777DC5CF06ECC /* GCDWebServerURLEncodedFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 399E2B8BEE8E886EE4016D87C5C85C63 /* GCDWebServerURLEncodedFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 09A6B67CF6F6BDAF375261535340DD3A /* DelaySubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0F9D84DF77D8398558F3D4F5FD606DB /* DelaySubscription.swift */; }; + 0A402C97D8A2855E4F69D8E2BFEE752E /* BRLOptionParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 49D4DB0A334289080782A137D04524BE /* BRLOptionParser.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 0A80FDAE7915EE476A38C9CCC68FAC69 /* RecursiveLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7D4EDDDDBC9A8284DF4316C7F919EB /* RecursiveLock.swift */; }; + 0B24DF0C1B8DFEC4738DE16AE0467553 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 218389799BBF34D96B7BDE06ECC09CD9 /* Disposables.swift */; }; + 0B8140968914C908CFB4949F67745DD7 /* GCDWebServerFileResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 00208F1C08F49846BFE1A47C2AD5C562 /* GCDWebServerFileResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0C68821E6FFBD9B3D36F863B392E9D1E /* StartWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1910F3BA8275DA306C03AAF91366CA17 /* StartWith.swift */; }; + 0C8240D6CEBBEEA043891D3FC5B6583D /* AnonymousDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB8E26A34CAE0B693F1F2C52465402C3 /* AnonymousDisposable.swift */; }; + 0CD517FAACCA346523AC5681E5451D4A /* SynchronizedUnsubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D1F9A72CB74DED14E390F65E400A19 /* SynchronizedUnsubscribeType.swift */; }; + 0E5DDCC45FFD8714E2DCB955C83D4130 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17B662771CEFD0C752DAF2C38021A7EB /* Timer.swift */; }; + 0FFA1CFFE797C9500D68689C5D9AE025 /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1FECC6066F8385524F9B523590A82C8 /* DisposeBag.swift */; }; + 0FFB5E639F74E4ADCEA6B4691231D788 /* Binder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82B40C2141EAEBD3F4738B4EF37F735E /* Binder.swift */; }; + 10EB23E9ECC4B33E16933BB1EA560B6A /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 219ED455E5F4B8EBAC276EB23D845469 /* Timeline.swift */; }; + 113A11F61DC88927204A3B8024EEDEE5 /* AsyncSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B62CFED1E64A9E67642177FF31ADAB0 /* AsyncSubject.swift */; }; + 12149EA10608B7DE38879E6242D2826C /* ko.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 42C5B04BED868BDFDAD6B1B4CEF885F1 /* ko.lproj */; }; + 12498A71D7F9769F2686E137BEE742A4 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE9523A3F66C7512A04D217B9485ED49 /* PriorityQueue.swift */; }; + 1306B351B70FAEA38005826E3E0B7F3A /* KVORepresentable+CoreGraphics.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA2390463C1EED454182AA10546F90EE /* KVORepresentable+CoreGraphics.swift */; }; + 141D65E8D754B3CD6053D152E60EBCC7 /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CE7BAE0F6A7178D9136F1DBE9CE0D3 /* Platform.Linux.swift */; }; + 1568BC317134F1902AB76EE65E0A18CE /* GCDWebServerDataResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = DB253165A9F6EDB8299D6D115FAEBD42 /* GCDWebServerDataResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 157AE1FBA8F6C3B710CDE90F86492010 /* MASShortcut.m in Sources */ = {isa = PBXBuildFile; fileRef = 94D1A921D2DDCB6ADE167A6D9F9FC69D /* MASShortcut.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 16C4E1D2700082128AEFB0A56E339123 /* ControlProperty+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = F998ED9B73E72761135D03EABEA4CF52 /* ControlProperty+Driver.swift */; }; + 172294F530504F23FBD67243FC416996 /* Take.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121D3DED6F325810B808C962150FDF6B /* Take.swift */; }; + 17BD24642744FE2260FA6811B165388B /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E334CC8401F5E9485DACD3CF7F789B90 /* Buffer.swift */; }; 1AB0577134E333EA71DCCE332191A260 /* Pods-ShadowsocksX-NGTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 46662EB64876AD1C891F548C69A89E89 /* Pods-ShadowsocksX-NGTests-dummy.m */; }; - 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AC8837A9B05156CBBE4A8FECC465034F /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1BE62ECDA4B3A8B13C8B78ACC98795E5 /* NSControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7C79F11D25CEDB1D05648901AFF01D /* NSControl+Rx.swift */; }; - 1C12866E3E74BE6F0513E46B48ECE1D7 /* Just.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A2D9F47CF554F3D0FF28A201822E872 /* Just.swift */; }; - 1D644164F050145109BA5D7BEE9614B4 /* Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFF880C34F99282A87D40EEB06740D80 /* Driver.swift */; }; - 1EF1D9B948C91F3CAD0F2998F3765D8B /* GCDWebServerErrorResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = FCD773B3B520BDB18A9BB4B403F9DC27 /* GCDWebServerErrorResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F1B7F5EA399508BB5091B36C1C95671 /* CombineLatest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E366C7D398E704625CF7481FD8243D48 /* CombineLatest.swift */; }; - 1F3245B199B67151AD148F2697312170 /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16B0EBC2B5BA4309D9844CDE1932B26 /* Throttle.swift */; }; - 20887597017160017549465EBFB7E977 /* zh-Hant.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E4EC11834E14E9B2C39B5615DA787A71 /* zh-Hant.lproj */; }; - 21378D436C90D7B4D65D820281D159EA /* ObservableConvertibleType+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 728798194C8FC2BA7D507A14593C9C6F /* ObservableConvertibleType+SharedSequence.swift */; }; - 221FE7E633BA09E8BF6B4B2FB9470EED /* Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3EFB1E8AA462C2C937015579F139C13 /* Rx.swift */; }; - 224087BC52D59C54611FDC38839F2D33 /* TakeUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 359132E97DDCA64E851B2CE3FE71F813 /* TakeUntil.swift */; }; - 237C447BF6FCA534AB4A2F91BA2731E5 /* AsSingle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B1F2B769E9F6355DF3AC956AF04D064 /* AsSingle.swift */; }; - 24DE12FB296FE104885D22B0F0D73E5C /* Producer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6E4C64CF7155899BC2A74A24FB7513F /* Producer.swift */; }; - 2527F62CEADDA5CE60852E0C067D3438 /* GCDWebServerResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B432AF0284AA5FB0D45EED8A72A6B1A /* GCDWebServerResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2545E11592C408516EA9AC047FFD47FD /* BRLOptionParser-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D373DA90C38C00B903B1FD9CD05CEC4 /* BRLOptionParser-dummy.m */; }; - 260C370245B63D4004DADF4D24E3BD00 /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20E5746A4CCE940BCE91535C0D37FEB2 /* ObserverType.swift */; }; - 264617822F4D99335F47F6AFF80253BF /* Completable+AndThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 878BBACC17D3136FA4DD1CD04CAD85A0 /* Completable+AndThen.swift */; }; - 267EA57772E03E12F78E25D3AF60616F /* Variable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 924ECD8580145EBC5702BD6D3B314F61 /* Variable.swift */; }; - 2708274C4337FB152E46FE16728C8704 /* SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = E707C81E7EB04DBC63A2429C29DABDA4 /* SharedSequence.swift */; }; - 286A79B0F2405FD08804042FE30407B1 /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = CD3F084299BD99D03F6B8FC8783B3AE8 /* GCDWebServerMultiPartFormRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 28B9D3AD37C41CA2B5B954BC3F2A4CD2 /* MainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A9DE35FDE449CC76ADF563645C81738 /* MainScheduler.swift */; }; - 28F9B941634C8440F300448D8F5802A2 /* SynchronizedUnsubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68041DC65BD6DADAF82378F8875B3FCB /* SynchronizedUnsubscribeType.swift */; }; - 2A2F65DFD1EE779D4F51A48FFD66C197 /* HistoricalScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = E88567B756C3B048C0FE65824DF88BF5 /* HistoricalScheduler.swift */; }; - 2ADDAE50C265B5025D0B1F9764BBD3AC /* ControlProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 255132D91D9485882D3509D158D686F2 /* ControlProperty.swift */; }; - 2BC4A1BBB3CF1E3736359EAC2557EBA1 /* AnonymousInvocable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1510E6FAF4B06DADDD220C9F52E25600 /* AnonymousInvocable.swift */; }; + 1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D77C4845A393085D1F7FF68A785D6A6B /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C68805E7E2B3594CB435A185A6C7A6B /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = A604573634B3B440BAC80E6185340643 /* ToArray.swift */; }; + 1D51BDA7275CF818A0072751DE5EF399 /* InvocableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FF3E0A37CDE9554E186BAE00CD9C197 /* InvocableType.swift */; }; + 1EF1D9B948C91F3CAD0F2998F3765D8B /* GCDWebServerErrorResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DD66E9E374587EE9AC648D811B5042E /* GCDWebServerErrorResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F60D3DB469D63B9ACB07A1C8C322879 /* PublishRelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A04D2678FFF63F78747A96526C32525 /* PublishRelay.swift */; }; + 1FC45BAE1645E857B19EBB05E0CBA244 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78755706F21BACDBA952EF615AE4223F /* Errors.swift */; }; + 203CA8CA9FC10517AD691B4CD2D35B40 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAA642364AC03341491D3F3B2B55D566 /* Event.swift */; }; + 20887597017160017549465EBFB7E977 /* zh-Hant.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 30E4F3002967D50F222222D209A56B79 /* zh-Hant.lproj */; }; + 2184836F18B35AAF94E8BE8B40206F15 /* Generate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 920735A244F39A83F52DF97FA4E7427B /* Generate.swift */; }; + 2356019614669E69E722D77C43A90A07 /* Single.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9308FACB56EF2744A5DF058B75203AE6 /* Single.swift */; }; + 23A86C508AE8C5C1615208352A05ABC4 /* VirtualTimeConverterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA4CD1F6811E9C48888466AB8169A09B /* VirtualTimeConverterType.swift */; }; + 2527F62CEADDA5CE60852E0C067D3438 /* GCDWebServerResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = DD640DDC7E829A09ED1072907C443481 /* GCDWebServerResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2545E11592C408516EA9AC047FFD47FD /* BRLOptionParser-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B4CB86E9D779A444876EA5C4C68A3FBD /* BRLOptionParser-dummy.m */; }; + 277E1C593CBC2FC2935E8377ADCB4F9D /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B8C0CBA55B2D8C521EC4555A764C4A3 /* DisposeBase.swift */; }; + 286A79B0F2405FD08804042FE30407B1 /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 83A9CCC244BECF2D84BC459532DA1B78 /* GCDWebServerMultiPartFormRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 2942BED5614FBEF4C6D07C7B9C746F1F /* RecursiveScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52EE2194BA2C33781397BBEB8F4C9276 /* RecursiveScheduler.swift */; }; + 2A1DB4D085BAA9578B77458893659DDC /* NSControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20F25597538DF7C1290E5ECF3BA6073 /* NSControl+Rx.swift */; }; + 2BB6D185FB842C820E5EAC08FDB3A19F /* PrimitiveSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5D00060FD1C8FC81DFDD4EAD1FC02BD /* PrimitiveSequence.swift */; }; 2C16189485F3647493E5E74E8C629E54 /* Pods-ShadowsocksX-NG-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 14A9EC2BB1EC6484018A5EB4B9B2C231 /* Pods-ShadowsocksX-NG-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2D5E4C0C7C41AFECCAFFA9121A346A3B /* SchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEF8F1346C831D7B8A9AB960E3B768C0 /* SchedulerType.swift */; }; + 2D0D484C1ED547F456B759214405D595 /* NSView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83268468D9194D59FF72E067422BC173 /* NSView+Rx.swift */; }; 2DBAC0452D6B85DF3E41E3AEFB4EEC16 /* Pods-ShadowsocksX-NGTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D7E8128F302CF60BEF206008CE11F6D3 /* Pods-ShadowsocksX-NGTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 300708DF4452315A732C36A381100EF6 /* OperationQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A0BEC4717A975478F52AD458ACA42AA /* OperationQueueScheduler.swift */; }; - 3076DFAD05E4F7F0356153478F071D74 /* MASShortcut-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F552E19724BF0CC37D66E1D5DA273720 /* MASShortcut-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30DF48D3434CB214CB0A8DC882B57CE8 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65BABB33CC0139D359C0ECABD05CD0B7 /* Switch.swift */; }; - 30E2A73CDE464DC6C23D3524F07FBB9F /* GCDWebServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 88003809F8CD8A52B418884D95EB7FFD /* GCDWebServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 31FFC304499832DF396AEBD4FE47FD41 /* TailRecursiveSink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B7FB3B8F0F547E0CCC3EDB3FA5509E5 /* TailRecursiveSink.swift */; }; - 327528E493914C52BB5D9C6588E46619 /* VirtualTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752306794D721D2E1BF157AAA32771ED /* VirtualTimeScheduler.swift */; }; - 334670C40333B0360D97D38097EB5A8C /* Multicast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EC1B5940ACD0BA9FE7309429D6ED68 /* Multicast.swift */; }; + 2DC07EB6B16990A067D1D053382C1573 /* First.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D4898D741BB7A3E63AD3625C5913FF4 /* First.swift */; }; + 2F9F38633F6ED088810B32CD54529D84 /* TailRecursiveSink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C82EAFB5F96FA6732152002CA4666CC /* TailRecursiveSink.swift */; }; + 305A214BC25347F3EF3994A5DE5C5F25 /* ObservableConvertibleType+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12D136B18E0E7F8F564601A28FFF96F /* ObservableConvertibleType+Driver.swift */; }; + 3076DFAD05E4F7F0356153478F071D74 /* MASShortcut-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ABEF7628490A51F0ED3BE67393DEB56E /* MASShortcut-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30E2A73CDE464DC6C23D3524F07FBB9F /* GCDWebServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AECA5396C8BF81522F020F67B5051752 /* GCDWebServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 317DE7777E93EDA37B798E4778E8AF24 /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B96C6614EE1F3536C3C06892684F2657 /* Disposable.swift */; }; + 31DE016EE6C90B9498B1F08BC34CDC9B /* SingleAssignmentDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C65BFED56C12E4DDC34449B0F00BC4D8 /* SingleAssignmentDisposable.swift */; }; + 32F59423331F13E53E93207A23CAB81A /* Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE8A310F9FBC0D6FDD4C8E3D891605E1 /* Optional.swift */; }; 33669A1E8FF6BB34131FB94871DDF908 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 355E3D24221C05473338AA2B0E9E613C /* ControlEvent+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22D55ADD097A4317EEBBEAC8CA5D2328 /* ControlEvent+Driver.swift */; }; - 35B3DA850A250223EE5CEB9DB04D1FC4 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 72B8CEB9D05921D08AA078AE17F53770 /* GCDWebServerResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 3614DA072E285FBA231AAE506DD00722 /* BehaviorSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F5BB1CD589B3E27B8A75FA688E70401 /* BehaviorSubject.swift */; }; - 3626B94094672CB1C9DEA32B9F9502E1 /* TaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8395CF3A1AD4518051CE6450BDBC43BD /* TaskDelegate.swift */; }; - 36CD88E2D2099581BC19D42048D158B2 /* Observable+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CC9430D7E7FB49F1A03FD83C0F15DF0 /* Observable+Bind.swift */; }; - 36E0FA5FE4424D20F0215B1C2CD85D90 /* GCDWebServerRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 58CB4D7A6C8CB1B887645BE2595AFC0E /* GCDWebServerRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 378839FF60B0284A71199E89C842E921 /* NSObject+Rx+KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5945D007DC7A2B629B8E5987E6184267 /* NSObject+Rx+KVORepresentable.swift */; }; - 380B25054F2B7FCFE08A5228DA847BAB /* ObservableConvertibleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636B1F25C166F05CF62D7805112E6124 /* ObservableConvertibleType.swift */; }; - 382B5A192325665D099B202F758D765C /* Using.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1AA3C8E05F2C2D813D16D20D9984553 /* Using.swift */; }; + 33A3CD60ECC4477B864CD8463A4179C0 /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C851BCF7777F05B23845D5F3B42477A /* SkipWhile.swift */; }; + 350B80BF6F26209C3BD76F4FD3E93E3F /* ObservableConvertibleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9A3C739C0FF5F8BD8B24A9AF4939DC2 /* ObservableConvertibleType.swift */; }; + 35B3DA850A250223EE5CEB9DB04D1FC4 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 02C1C424F1F955C157E2AD0DF9DA85CA /* GCDWebServerResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 3626B94094672CB1C9DEA32B9F9502E1 /* TaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18D47804A6E897EF20B93DDAE8450B08 /* TaskDelegate.swift */; }; + 363B6BA64ABF7E326581E60BF57E9E73 /* BehaviorRelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2845A68913E943BC36DC30691EC2767F /* BehaviorRelay.swift */; }; + 36E0FA5FE4424D20F0215B1C2CD85D90 /* GCDWebServerRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E035F93086E0E9404B6C0C525F9F238 /* GCDWebServerRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 37F45802E36DFB8D332DE998347FC8EB /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23A3D60EBC5FA9D3A2E4ACFAD6428316 /* Lock.swift */; }; 382EEA9832CF0E0860B998EAD0EE66E1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FEC4B8DFE8753A9B1DE598293568F30 /* SystemConfiguration.framework */; }; - 3867C0C197045398134BE70D72B7A1EA /* Materialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B29EA946AE6D8BE387824C42B121D67 /* Materialize.swift */; }; 38974DB132715266ADE00F2E3DFBB320 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 3C808C81AACAA8641399DA9AA95C0F71 /* ElementAt.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFB8EBD43A17F895E88B967D4BA489A /* ElementAt.swift */; }; - 3D31990DAC7D206A8CED0E166967345E /* AddRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 545894F30123AB01C758C6689014BCC6 /* AddRef.swift */; }; - 3D56193C6790214CE39FA76DDD3CF8D2 /* Debounce.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8169698EDB7D60F459C13552F619848 /* Debounce.swift */; }; - 3D693429A31AF334FE584D395D7E6133 /* _RXDelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 72FDEB0BDDFCA5B67411693DCA3BAB36 /* _RXDelegateProxy.m */; }; + 3A9F650F4A2FC5D727FF281AAC625171 /* WithLatestFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FD412C15BC617CC38E190F17BB06655 /* WithLatestFrom.swift */; }; + 3B89F320811AC31E66E7B14CDF9046CB /* NSSlider+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 115DA97253EAAD8E69D0C8D6A825B18D /* NSSlider+Rx.swift */; }; + 3C507AB95BF1F4AC2F692FE5CADA9CB2 /* Materialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1791718F5CC919CF52642A71FE4AAAF /* Materialize.swift */; }; + 3D22B1CDCC3977BC8CF2B71D3645386B /* SynchronizedDisposeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98923078307F200863DB7C59FCFC7002 /* SynchronizedDisposeType.swift */; }; 3DD0362B0B6B939B5D087A150121A4B1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 3E535F38140F4E1ECFB098340836F763 /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA02D299CE44B023D9B4909ED0B34FCC /* Disposable.swift */; }; - 3E715DFE443524EB6ADE892E4A676224 /* GCDWebServerMultiPartFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 00CECA213B3AA462DCD88A69F686C862 /* GCDWebServerMultiPartFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4075D8C048D42B2CC057C53323F3F462 /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FC9E4C5BE139DEDCF232F464EEE5F9A /* DispatchQueue+Extensions.swift */; }; - 41F5717673BC090472587250F4A7BDFF /* InvocableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29DCD7692E660B9C1FF8E7A3063F2B47 /* InvocableType.swift */; }; - 42A2F56A949ADB27CDF4ACEF31A84EB7 /* DelaySubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = F546C188C97659BE86FA0E06FB1674BB /* DelaySubscription.swift */; }; - 437FA9F525690A3F247B254130EA26C8 /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D904A8BE8B963C1CFDCB978A106290A /* Buffer.swift */; }; - 43CA37C05E91E1511246D5A99ED30AA5 /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20192591D331E03B112CEAB1C32D1FCF /* Sequence.swift */; }; - 48FE45BD7BF4ABB32A024550ED96B4C6 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = B677B77B72CD0E70D2DC5499A6D18B31 /* GCDWebServerStreamedResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 4A08159FBFDD0D49A7E097D1A6D8ED1C /* Generate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABFF341309F8A2E61DCB2F092DFF2CA /* Generate.swift */; }; - 4A6AF0A712D4C473177BE88389D15D2A /* MASDictionaryTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C49546F441EF6B013C11F9ECC4E494E /* MASDictionaryTransformer.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 4CF21399A46B77C62FF0342B6719FCCC /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5613FC3B7810194DB766F2AA387847AF /* Errors.swift */; }; - 4D634321FD0AC2411D399AF0CD21D19B /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761DD04D13CF5C96E3661EBB41496409 /* SubscribeOn.swift */; }; - 4DC0FAD6E6A6615179C8AA7C5E2862F7 /* DefaultIfEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB2D9630B47A5E202FF1CFB831ACACDE /* DefaultIfEmpty.swift */; }; - 4EDE49009B5B68074CD71F8B362F0DDC /* GCDWebServerDataRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = FF074D96FBC0786D113FA8954363F7EF /* GCDWebServerDataRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4F17B41C7A5D3F2A07AB16B08CECD9B7 /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E8E56BD7B85F3AF4B5FE7AF03AAEE8 /* Logging.swift */; }; - 51358F3E24AC8F1A4172E388769FF1FA /* MASShortcutView.h in Headers */ = {isa = PBXBuildFile; fileRef = A077B4E84F0E05629C70075B9B9D871E /* MASShortcutView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 51750A5B573347F29ECB252FD6F7B809 /* SharedSequence+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 606D277095EEA4BF6FEB8D9270E15542 /* SharedSequence+Operators+arity.swift */; }; - 52FC9AD6D1323BBDE4D458D780833850 /* Amb.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAD59D3D739C07FCB2F892826F951063 /* Amb.swift */; }; - 5387216E723A3C68E851CA15573CDD71 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07BCC46A8B3A4B93914CB0C0624B3942 /* Request.swift */; }; - 53C65F51E7A47A1B14E324AF29A41AEF /* NSView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9352AFD1D6C6B57A9AF36DD5277BB196 /* NSView+Rx.swift */; }; - 53D63A17DB43C044EFBAA17337600276 /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 22EE8CE9A144E74E024FCD831B543700 /* GCDWebServerRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 548EB267AD5A7FD7AC26FAAD9C2DA7AE /* Skip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C6BFE2E2D5A6B7A594B788F625561EF /* Skip.swift */; }; - 5639004CE97536B6FEA6EB60E83DE411 /* DelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBF94F2FA57AC086015ECB43EABA8CE0 /* DelegateProxy.swift */; }; - 576947974CE51E704014B05BD610775C /* SynchronizedOnType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A25F673AD7CCCE0189ADEB549EB5F618 /* SynchronizedOnType.swift */; }; - 58CE04D9C6CAC7243825ABF4AB20EF32 /* MASShortcutValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FAE9397A18DDA64A11847EF6BA0476C /* MASShortcutValidator.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 58FD6898891A4D0E7D0E32043FB71976 /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3637E3CB5915225EA71EFF6B20D7171 /* CompositeDisposable.swift */; }; - 599AEBFAB1C1C451709CC28400BA7460 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BBA11BAC502FBD57943042D6D9D8975 /* PriorityQueue.swift */; }; - 59FA89429C44FFFC10AE0FED40033C74 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FABCD0845EFCC0E95BC4EF19880A8D3 /* Filter.swift */; }; - 5A30DAB76BB1814664FA7DC30939DA24 /* MASShortcutBinder.m in Sources */ = {isa = PBXBuildFile; fileRef = 98882780F0AB1693529D79FBB62760CE /* MASShortcutBinder.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 5E167DB5B613ACD8F7823C48F73EBDB5 /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ADE820F11CABD3D1C1218580FD439A2 /* Platform.Darwin.swift */; }; - 5E38136ECF2487CEB1671D6D231E3F5F /* Empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0581044A5A088C077656011651C2465 /* Empty.swift */; }; - 5F1FA9D431587CD257C703AF16134030 /* ja.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B8342F1DDDA13DCD8CF77080A6A16BCC /* ja.lproj */; }; - 5FF7D42F51FEAEB192E61355AAEAC6DE /* MASShortcutMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 55178DF04DDB4E9CA87135167C286E60 /* MASShortcutMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 601F21CBA959E531A349EB3E52FE995E /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B3925E8418FB15723527909346442D9 /* Bag.swift */; }; - 61200D01A1855D7920CEF835C8BE00B0 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE411A2DEA5A7FCC657E6AE76503E34C /* DispatchQueue+Alamofire.swift */; }; + 3E715DFE443524EB6ADE892E4A676224 /* GCDWebServerMultiPartFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 82AB01A10760A9DBC7F68ACDB184CB9F /* GCDWebServerMultiPartFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4021AF3A4FAF79BB86F80005B72627BE /* SchedulerType+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEC68B3F3AAE886E35269B85EAAAA4A2 /* SchedulerType+SharedSequence.swift */; }; + 4101FFED5C58EEB5FFF2F58ACDE18AD9 /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = D37B5D016E968A982C96D680E27224E7 /* TakeWhile.swift */; }; + 4165379A8A38766F01C8DCA38C1636EF /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12628820AE714729D03F0AEE969EB3CD /* Logging.swift */; }; + 41FD1695AFDC553E66D35A26AB0E14E0 /* SchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41C0048A00AC76527EB7E552AC524DAC /* SchedulerType.swift */; }; + 420D4C0DA53B332CDDAA294AE3E7B740 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68F3C7D40CA579EFBF45E9BDF4844714 /* Error.swift */; }; + 42B758DEB73A71CFEE6AB0091A4D51FA /* ConnectableObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44F80D944345E3B50B5CFF78E7C4E4D9 /* ConnectableObservableType.swift */; }; + 4540E2CEAA8B2C8A52C60707F64C9952 /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57692BA24E650520C1D877523C0A5F0 /* Queue.swift */; }; + 45E690B4908CA6A5E5903A62C51B4813 /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = B140252F1C653182982BDDFA6F4DFFEF /* TextInput.swift */; }; + 46BF838ED5099DE5FF962D68D79D2349 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22693A1922310B1DDCE8D9B91AA49677 /* Filter.swift */; }; + 4708A1DA6FBEAAC23B4535D8770289E3 /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC7D06D7C30521ACFE2CB8810BAD6EB4 /* Platform.Linux.swift */; }; + 4818C1BB29E7C2BF255D9941737665EA /* MASShortcut.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 711B62B6A01799BBCBA4F90D70C6AF28 /* MASShortcut.bundle */; }; + 48FE45BD7BF4ABB32A024550ED96B4C6 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 987AC2089C4B4C35C212D30E0C0E7B9A /* GCDWebServerStreamedResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 490B8F69828862C7939BE0F47D6DB89C /* GroupedObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28578489FE91CF078CD23E26E04E3BBB /* GroupedObservable.swift */; }; + 4A4408FFA76EAF3E6C82888069FA74BA /* AddRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9589591754500401F219D9EC60BB6AD7 /* AddRef.swift */; }; + 4A6AF0A712D4C473177BE88389D15D2A /* MASDictionaryTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 56904622AEC39DA2CC3FFE7AC03DEEA7 /* MASDictionaryTransformer.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 4B011F87C4CD25363F21DEF2C9581B25 /* DispatchQueueConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0141E6A6B4EB3619B0171F6D6AF2EE49 /* DispatchQueueConfiguration.swift */; }; + 4E7600A3BA0F81B1973B887E025DF056 /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2977417D444B5687C65F2845036F130C /* Sequence.swift */; }; + 4EA7780B43C03F302BC16E613600AEE6 /* Completable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F5083A9395E7BC273257A316BA5D517 /* Completable.swift */; }; + 4EDE49009B5B68074CD71F8B362F0DDC /* GCDWebServerDataRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = D80BBC49309E8C0FFEE8339DD05B1420 /* GCDWebServerDataRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 500E908BCC57EF5E1F7F918B9876CE23 /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D883EB96731562A3DB6A5D9BB316164D /* Throttle.swift */; }; + 51358F3E24AC8F1A4172E388769FF1FA /* MASShortcutView.h in Headers */ = {isa = PBXBuildFile; fileRef = A0BF6605792D11FF8BA02337532C154B /* MASShortcutView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 532068C53B54FD7232B59B5DB2D9EF77 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCEC9093299246040636BFC7D014387 /* SwiftSupport.swift */; }; + 5387216E723A3C68E851CA15573CDD71 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = F58912C1C682D706B91088B2E3E28849 /* Request.swift */; }; + 53D63A17DB43C044EFBAA17337600276 /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C6FF8174AF3551817D3375622AD00A6 /* GCDWebServerRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 54D6EC90DA6336155F9A83D7F630E4EC /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BC3571EE031A7539BB287EFCD666847 /* InfiniteSequence.swift */; }; + 572B991A35A12B7D033F2DC67451FC0B /* Signal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E7682153DC4B4654DC8897B52E1C68A /* Signal.swift */; }; + 58CE04D9C6CAC7243825ABF4AB20EF32 /* MASShortcutValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = B9FD186DCB0C2486656EE428FDF24E95 /* MASShortcutValidator.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 58D21664187909739FA5E11A5AC1EB04 /* Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC9CBF3F42BE77A6A4156483F6E7A677 /* Driver.swift */; }; + 5A30DAB76BB1814664FA7DC30939DA24 /* MASShortcutBinder.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F78B857D0E9107E4AC4BE639CB5FDB5 /* MASShortcutBinder.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 5AB4432DDFDFFBAF30B04131BEA65884 /* BinaryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C143DF478B2ECD2870DC326426CCA893 /* BinaryDisposable.swift */; }; + 5CC209128C782B168EEBF07741EA406C /* NSLayoutConstraint+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3A10808A0957AA2EC5EB7D1A77E4B27 /* NSLayoutConstraint+Rx.swift */; }; + 5E04C336772C75B4BD3DE0FDC9D7F082 /* BehaviorSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = D88C03DD8DB2FDBDB751F6E0573A19DF /* BehaviorSubject.swift */; }; + 5F1FA9D431587CD257C703AF16134030 /* ja.lproj in Resources */ = {isa = PBXBuildFile; fileRef = BF25BEA59068FC2091F298B09B53F9A0 /* ja.lproj */; }; + 5FF7D42F51FEAEB192E61355AAEAC6DE /* MASShortcutMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A842F5AB01E533C407EF9F939D43654 /* MASShortcutMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61200D01A1855D7920CEF835C8BE00B0 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420BCA1748F9506534FB0A233C6EB49A /* DispatchQueue+Alamofire.swift */; }; + 612281D2096564D60D241186DCAE5706 /* ObservableType+PrimitiveSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51298DE535C414C093FA9AEE5A210C4E /* ObservableType+PrimitiveSequence.swift */; }; + 6135396E25194755B2FCFC03C62263B3 /* DistinctUntilChanged.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8289A948846D9CADF1D390856F40AF89 /* DistinctUntilChanged.swift */; }; 618D3C71663174E07B65950421C46D48 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 139134EE845E284F4B3ED2EF2F9A302B /* AppKit.framework */; }; - 61C12CE6D79EB6A96AF17AABAFEDCBDC /* AsyncSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6FC4FABF722AF2F518BE654AD7DCE4D /* AsyncSubject.swift */; }; - 61D1DF6515813E069AA2191EDA369286 /* KVORepresentable+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A20F2D6B7A2D475A3BEF0CAFE123400 /* KVORepresentable+Swift.swift */; }; - 61E61C4B8FD7BA59062CBE45764790E9 /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B539B1FEB1247454F06F69690A74881 /* Queue.swift */; }; + 623781D4B229E4D819BF3997A2F6F954 /* ObservableConvertibleType+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4824FF61369273279E9C73FAE118858 /* ObservableConvertibleType+SharedSequence.swift */; }; + 6252C2B00AFB3FC879D405191C4F8A4C /* Concat.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5BEEA74769B7463104E20202E1A465D /* Concat.swift */; }; 626A7B01D3D6B6EA0869551ACE82FB8B /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 62F65AD8DC4F0F9610F4B8B4738EC094 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 226616D9FEC0ABA73A4365514AEE5914 /* ServerTrustPolicy.swift */; }; - 659014230849E812C6185A976081B37C /* ObservableType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A923BB8E574DFADCE6DFF91F708E5886 /* ObservableType+Extensions.swift */; }; - 66A31FDD5EFC2321BC1A3AE5D97C0D36 /* Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 628F693AA128B618F45155C70C6E1024 /* Zip.swift */; }; - 66AD0D86950A5C05121AE482F5257717 /* GCDWebServerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = F308400B0F508083F4F2C54D3F787C5E /* GCDWebServerConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 66DEB394C39F5DCCD70A27ECEF274983 /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 200EE4899584F5D5767A63F4E7E1A627 /* de.lproj */; }; - 6832ADBC0198335F7B502C7DA1F0ED98 /* NSObject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 901EFAF9E76AF0F9D3DBC7CE6212D4B8 /* NSObject+Rx.swift */; }; - 685F29779740C956045776AE4D4E8365 /* SchedulerServices+Emulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DB38C96718DD2622736537BB2ECC6C2 /* SchedulerServices+Emulation.swift */; }; - 688BFF2000657BAADD192CA92249705A /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A143E562F6586266DBD22F7295D5AD /* Delay.swift */; }; - 6979DCB69E7266EC39F06DDB6D7D1EF1 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4154ED163C40AFD6A2FCB49EE532DC /* Event.swift */; }; - 6AA46000C79ED789B70D7B35743D5AD5 /* PrimitiveSequence+Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = B57622ECC64CA3D7C8ADDDEA14B176F5 /* PrimitiveSequence+Zip+arity.swift */; }; - 6B0F3785D9AE93550ADA347C926ADB1D /* BinaryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3AEFA8AAF6328813FEC6D38028EF063 /* BinaryDisposable.swift */; }; - 6B4361F5ADC6268E7953732371174FE9 /* MASShortcut-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BC5A23A63EA04BBF65EBBC3D5905D453 /* MASShortcut-dummy.m */; }; - 6C5CC1496F30D2247B546F3867DFD342 /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6078A9FA6BBA43845BFA8D0BA163E903 /* Platform.Linux.swift */; }; - 6C62ACD1AF9B80626023D3E654D3E77B /* GCDWebServerStreamedResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 5222FC0287904A0C1050B9B01E9712F8 /* GCDWebServerStreamedResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 62B5F416D74F8147F7DF9151B9CB0A96 /* Deferred.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1EA13DE495837C31F4526D7FA1F7795 /* Deferred.swift */; }; + 62F65AD8DC4F0F9610F4B8B4738EC094 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = F41F3F896039E0F2EE235A159F853B08 /* ServerTrustPolicy.swift */; }; + 6303F577E7E204EDD3290341645A3C93 /* BooleanDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7849EB1549B76C509FCE0465C3EC6585 /* BooleanDisposable.swift */; }; + 63BE27B8249C72EC539F4F5367E9DCF5 /* NSObject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B43F76AA34F7FD88FC35F826FE0911E /* NSObject+Rx.swift */; }; + 640BB2DA5629DF979311584E6F4AC09B /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D0E7B6D1939F2FFB2328BAA55AB8D33 /* SerialDisposable.swift */; }; + 66AD0D86950A5C05121AE482F5257717 /* GCDWebServerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = B7C8CD3DFA056CB378EA8126D471FE4D /* GCDWebServerConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 66DEB394C39F5DCCD70A27ECEF274983 /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5B35B3E1CD06D484F53A3E476AA3686D /* de.lproj */; }; + 67257E0D79F725528DFE2B3DCC0293D5 /* SwitchIfEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CA83DA1CEDBDC939542356592B40AB3 /* SwitchIfEmpty.swift */; }; + 67D8ED58AD2C8315F19FB3F7DD968893 /* RetryWhen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7566FCCEEDFE8B433D83AD311795E367 /* RetryWhen.swift */; }; + 6854825AC3848196270B428A36FBB043 /* Merge.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A874527BA87240185BA903D136C3AF /* Merge.swift */; }; + 6A64206CD6836AC8FEF84C6156CD8BEA /* ConcurrentDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 740D1DD30811098DBF267CA2EBAF0448 /* ConcurrentDispatchQueueScheduler.swift */; }; + 6A7F23D172685A59F7890947DE5B288A /* Signal+Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D3C210247CB8CE3DF722B8D487265EB /* Signal+Subscription.swift */; }; + 6B26270D538BBE32EC979CE071CC218D /* Driver+Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F79F86B3A28700C995D5AC30EC550D6 /* Driver+Subscription.swift */; }; + 6B4361F5ADC6268E7953732371174FE9 /* MASShortcut-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C54EAA06C0712228D110E5F33FD72EC9 /* MASShortcut-dummy.m */; }; + 6C62ACD1AF9B80626023D3E654D3E77B /* GCDWebServerStreamedResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F53F9BE0FC6F1436AD8032E8FF6D80D /* GCDWebServerStreamedResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6C70E6D376363F78D7BEA000B5A1C309 /* AsyncLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA0D68D388D0343FA7D9603F2972F301 /* AsyncLock.swift */; }; + 6C97654D360B43FE6AF6582D4E27FB55 /* Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C92E152F7133108027B5F35A4EA2F6 /* Sample.swift */; }; 6CE3F1A01E6DE8F58A874B780C66A6FA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 6D1B82733CCD35C7B720D8B306969DB2 /* _RXObjCRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = E8D80F3DDE713A93804F0B81C53471BB /* _RXObjCRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6EB4C5113BBA1A69F56A6BC63B6E62D3 /* ConcurrentMainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4901C7D532E5179B742DB643CA1B408A /* ConcurrentMainScheduler.swift */; }; - 70B0A108A1AA2498B53B6247AB6B85F3 /* ControlEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D9D5A3377EF4CDADE4D80FC29C1F20E /* ControlEvent.swift */; }; - 7214838BF73F3401200344955729C789 /* ControlProperty+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = F316CF662715DAF0DC0D4AB967AD6709 /* ControlProperty+Driver.swift */; }; - 7390ED4DE06437338430EB83AF3BD56C /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BE80522158C8CAE9E3CFE12B3D857F7 /* DisposeBase.swift */; }; - 74A825BD416A174CCCC55B0824EF2E05 /* GroupedObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A829DA85B827FD4953161E2FC29C0AB4 /* GroupedObservable.swift */; }; - 74EFCC6DC65CEBCF60B106F7FBB14EA2 /* MASShortcutMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = A0A5B4E433F12A0EE14939299BFA30B5 /* MASShortcutMonitor.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 751AC207B038ADC338015FD80AA54B76 /* MASLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 5089235C3188BE2DE716A15C48207E8A /* MASLocalization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6D1B82733CCD35C7B720D8B306969DB2 /* _RXObjCRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = 03F1DFC052C8E6481E56E12D5099A620 /* _RXObjCRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 70D7281997BAECEADCC60D9DEDCE4FC3 /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A0D3BBA7497A389734E9EEFBAE2464D /* TakeLast.swift */; }; + 71E974A4435358B0B1B371FFA5EF58C7 /* ConcurrentMainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BF437276A9A9AD2789D809F09705992 /* ConcurrentMainScheduler.swift */; }; + 720E93B2FE64C66DC3CFA6088DD40A2E /* Producer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F63A805EDA3A375F4453D75E39B46EC1 /* Producer.swift */; }; + 73D927F9EA3335CEB0C45239F31A9A79 /* VirtualTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB5D3778780DA8CAF8A3068FF9DFDC57 /* VirtualTimeScheduler.swift */; }; + 7487316C5EAAC9C271C7B797E99D3D22 /* NSImageView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C42E3C6553CD86CA08CB17F055E2FD1 /* NSImageView+Rx.swift */; }; + 74EFCC6DC65CEBCF60B106F7FBB14EA2 /* MASShortcutMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 3725898C57B3547AF4E212E583C75CE2 /* MASShortcutMonitor.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 751AC207B038ADC338015FD80AA54B76 /* MASLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AB0C03C6DE868D798024FA98E343764 /* MASLocalization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 75780983A83E65A597525566173E3C7C /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B792280B7BC7CA44B5D7090C8F732A0D /* RxSwift.framework */; }; - 76537FCDFF46E2EAA84E9632DB6A21ED /* MASKeyMasks.h in Headers */ = {isa = PBXBuildFile; fileRef = B2093E2378DE5EC41D64F8387561BF3B /* MASKeyMasks.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 799FF40352661DDA83AC794E9C604783 /* Bag+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA95194E204F208C75DB1F2E683163B8 /* Bag+Rx.swift */; }; - 7A5C24DD8864E48E6D43B8B98B594ADA /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9DE035DC4CC0F7DB299802037814F5E /* InfiniteSequence.swift */; }; - 7B5FE28C7EA4122B0598738E54DBEBD8 /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 268E53814A4808A9CB605BFB3FEAB50F /* SessionDelegate.swift */; }; - 7B70A32CB535894B889DC0400D0DE4B5 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = F656339EB8909181989F80623859B35C /* GCDWebServerDataRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 7C4028F18BB20A49E0C8E8DC7C07765F /* Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55FEBC89F2833AD13021CF63D4B810E1 /* Zip+arity.swift */; }; - 7C46C6DFBF9F5A96C6BCE1C93052B63D /* GCDWebServerHTTPStatusCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = F9164999952F9F74D2945D92DD778C19 /* GCDWebServerHTTPStatusCodes.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7D2E2372D60114EADF213080223E23D5 /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D97535E8704070D353435086265E041 /* TakeWhile.swift */; }; - 7D8CC01E8C9EFFF9F4D65406CDE0AB66 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20817295866FCA3DF75F20CA436D877A /* Result.swift */; }; - 7E20F5346ADC8F4F5C069EDDE10897FD /* MASShortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = F4E647FF308219F6F10EF468CFD459D1 /* MASShortcut.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7E4448CEDD753074D00755C6C8F71F0E /* UIBindingObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 788FB43AEDD6D9FD2ECBD95EAC8A97E5 /* UIBindingObserver.swift */; }; - 7F1D21D9C2B4DF301EF96533DF2A1FBE /* VirtualTimeConverterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8C4EEF5D5723B94ADD7BCE012A2C6E7 /* VirtualTimeConverterType.swift */; }; - 81B6397FECC803695902CEDB37CB4DFA /* MASShortcutBinder.h in Headers */ = {isa = PBXBuildFile; fileRef = FF9B0B9971EBD4F210054B63F172C41E /* MASShortcutBinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 81E3BA0A338814CAD1C95B57433B36B3 /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23DD34EFE94FB8C8DCE00EE72C2473BF /* TakeLast.swift */; }; - 823CA45387E1BBB3CB7D29B91B7FA1A2 /* Concat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E60ACE8054201E83089FD336ABCAA2F /* Concat.swift */; }; - 8552027632E115D6DAD1099C38090EAA /* NSTextField+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346BBFB5B79A5139190296845F41C8DE /* NSTextField+Rx.swift */; }; - 85924B29E50F5745628090826F2D064F /* NSObject+Rx+RawRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A1567F5FA8FE7F8CB94FF8182AFE361 /* NSObject+Rx+RawRepresentable.swift */; }; - 86D3DBB91C4ABB6920ADB46B5E158E26 /* NSImageView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23A34F10DBCE77625288E96057F56456 /* NSImageView+Rx.swift */; }; - 86F7FE179A98E2787500CA0DD68F2574 /* _RX.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FFA998983771BA589140ED254CFBD48 /* _RX.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 879141B5825E41A5704D637BAFDD29AA /* NotificationCenter+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFBD01DC827B96A71DBE4FF69755B797 /* NotificationCenter+Rx.swift */; }; - 886E89D85907BBD7A8C8BAA088D23E3D /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F5B2D680B55A87168B90861D051B746 /* GCDWebServerFileResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 8B61FFE12CF61FE5504472C344A1ED1A /* CombineLatest+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCE02B40B95BFF261200228AF8EBC16 /* CombineLatest+arity.swift */; }; - 8B66C13BF2C26F4C8E16368CC951B78A /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C7BE50FB7791D6009BF033B78EA631C /* Lock.swift */; }; - 8BA0EF598E6008B8E127F20CD5871EA8 /* Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E4A6E1ABB2E00314CDA799343BF5983 /* Sample.swift */; }; - 8BA67E4A4F689245492734AEAA8D6529 /* Do.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68DFB337F054F8982CF31389DBFF6374 /* Do.swift */; }; - 8BCC39E8753AAD1634783813630FC556 /* SwitchIfEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4C0501500E132C7E97A97A425E68D90 /* SwitchIfEmpty.swift */; }; - 8C5EA18EEE22A60BF10955E38F0D3A75 /* MASShortcutValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = E5C53D1D9FD46ACD15E6C5381BD7A754 /* MASShortcutValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8F015FD16EE1580601B4856E795196FE /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1F68587D16CABA9C7433492E59AB224 /* Platform.Darwin.swift */; }; + 76537FCDFF46E2EAA84E9632DB6A21ED /* MASKeyMasks.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BA0976D52E0B1BE7C75718D8F34D6D7 /* MASKeyMasks.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 774A0ED04EAE9326B4CE4E588A87C32E /* ControlEvent+Signal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81BA4BA48C5140576A6D93FB9EF7C2C1 /* ControlEvent+Signal.swift */; }; + 775A47C2CC9C252F6F612BC52258D549 /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B940616A1513AFB926A1625599603BF /* InfiniteSequence.swift */; }; + 7866C369C49972E30DD646C16447C682 /* OperationQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38541370FCAF5848E3402B758806B42 /* OperationQueueScheduler.swift */; }; + 7A88AD6D91DEB45F24205AB36E456007 /* BRLOptionParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D1F46FBDCCCDDD5DD811F74DF066657 /* BRLOptionParser.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7AD32C4A8B13DDEFF05DCF521E89B9E5 /* AnonymousObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF773B3F1B1F670D5A56FC9AC6EBE4D2 /* AnonymousObserver.swift */; }; + 7B42E31B60FD9B8235C6AE41B32931B2 /* RxCocoa-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DD070E26B8B863382F7AA226CF6D5794 /* RxCocoa-dummy.m */; }; + 7B4C3C45E92DB455C98680E229867CE9 /* DeprecationWarner.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D23B3353252A87A2DFCBE6BCAC355C /* DeprecationWarner.swift */; }; + 7B5FE28C7EA4122B0598738E54DBEBD8 /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E39B6AE9C7DBAF6F7102DDE428C6D4DA /* SessionDelegate.swift */; }; + 7B70A32CB535894B889DC0400D0DE4B5 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DF79E5957660D27729BE2711F7510D5 /* GCDWebServerDataRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 7BB8ED49DD0593318DBAB158D154AEC4 /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1221D61D7EDFE6C6834C60D4AFAD701A /* Queue.swift */; }; + 7C46C6DFBF9F5A96C6BCE1C93052B63D /* GCDWebServerHTTPStatusCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = 88223CC64D20FAA41D33B56DA90F1829 /* GCDWebServerHTTPStatusCodes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7C74AC76B4D748648227C86121B08243 /* ShareReplayScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DDB54ED8FEE2C1E06EFC2F722F8735C /* ShareReplayScope.swift */; }; + 7D8CC01E8C9EFFF9F4D65406CDE0AB66 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B9730D65B8F0B8AE3F7A91E58EB6705 /* Result.swift */; }; + 7D9AEF684D4E202E7D4D08DB26362A63 /* SkipUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2A1585CB16C85AE91BDB4B9405928A2 /* SkipUntil.swift */; }; + 7DCF1C20B4759A0D61B023AAEE75BAA1 /* Multicast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D3126A27429E648B79C41215C88F13B /* Multicast.swift */; }; + 7DE11B1BFD40161461B75775ACEA53D4 /* _RX.m in Sources */ = {isa = PBXBuildFile; fileRef = 94BAE73C588EBC604DCE573EBE4A04AB /* _RX.m */; }; + 7E20F5346ADC8F4F5C069EDDE10897FD /* MASShortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F8A0E045BE3B86CD42FE28A50C51A3F /* MASShortcut.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7E7F8834C1CEC6FC91F47FD16545AC6B /* ControlTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8443ACD9BB292ED1C07002A2677C9A6 /* ControlTarget.swift */; }; + 7F7AD0AEE5FEC490EAC6DA63559A6E3C /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB0F48DB0F38B80DF2708AB2292F08B /* ObserveOn.swift */; }; + 7F9313D68927235417B8703B0B4FC5E0 /* ObserverBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C15620E5544258EF1AEC163EC547C2E3 /* ObserverBase.swift */; }; + 80C368BB52E090970B402E0BA9D8B088 /* ScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 617D6EBFA395952801772F1383AB8AAE /* ScheduledItem.swift */; }; + 80D8BB858F559DD7483D2488BF11E820 /* SynchronizedOnType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0716C7A069A21844C312E62BBD3AC258 /* SynchronizedOnType.swift */; }; + 80F39A93408F43D4234F807D51686664 /* AnyObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22ECE1CB75987611F39ADE574AA7352C /* AnyObserver.swift */; }; + 81B6397FECC803695902CEDB37CB4DFA /* MASShortcutBinder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F5864100C7FDE5370D2A9D47B635CA3 /* MASShortcutBinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 820C8506D425B8392259E83BAD962B3E /* Empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62C6E1F6DE2D3160BDD5B13FBF1DD877 /* Empty.swift */; }; + 8240214BBCE95C6957ED5D6DC5D97550 /* RxTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 117E3E5CB18C4C8895AEDCB96CBFF566 /* RxTarget.swift */; }; + 83311F362776862EBDE3EA84F204F11D /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BF7CE3A988F181B6A3CCFCDAA25B69E /* Platform.Darwin.swift */; }; + 83E17A8F8042821DBFE379B8E721D9D3 /* DeprecationWarner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4E2B96284BE7E91A2FAC7A35722534 /* DeprecationWarner.swift */; }; + 8635269F248F424E4EECB84EAA5025FA /* Cancelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4498044F24BEEA463A62F313DBAF34A /* Cancelable.swift */; }; + 86F7FE179A98E2787500CA0DD68F2574 /* _RX.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CE15615F891AE84CC28B31DD1DFED34 /* _RX.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8738EB95B710731B66BECC5468B235C1 /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09A7C38F0BA34490FE74D086703D0869 /* Range.swift */; }; + 87DF52BA9D6A9A8A28DA38395FD6E52A /* ReplaySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FD70811FA75DA891378A68B3B6B4E2E /* ReplaySubject.swift */; }; + 886E89D85907BBD7A8C8BAA088D23E3D /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FEDBA21F3681BC1FBEB4E058BDEF1E4 /* GCDWebServerFileResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 88FBCBFFE4425441DC4AED87182340F3 /* ElementAt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA75FB12559EF9F38DE81CA6685BE6C /* ElementAt.swift */; }; + 891AF67A55755172995A43569453491A /* ScheduledItemType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A1C35E455A2F2765CD140138D5A1EEF /* ScheduledItemType.swift */; }; + 8949803FBCD4E3F9D862412EC64C1B2A /* PublishRelay+Signal.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BC8CC3D75BE1CAA9F4B2902AAF6A7F /* PublishRelay+Signal.swift */; }; + 897F13577AAA8382269EC194094D0916 /* _RXDelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 95CD99AE9A1C290252A419DD48B2A263 /* _RXDelegateProxy.m */; }; + 89B177904145220E5B578A6EFEE5D5A2 /* Observable+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2761A1137851210C3B778227D6BA8376 /* Observable+Bind.swift */; }; + 8ACEEFF8AA92153C984BCD3E6FEEFDD1 /* Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B3420B97151695E8A4E232D9A929713 /* Zip.swift */; }; + 8C5EA18EEE22A60BF10955E38F0D3A75 /* MASShortcutValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 57895F669A6A45DBE1808ECFCA7E6DE8 /* MASShortcutValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F6CC2B52C9EDF0C6F87877E25AB523E /* Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48FCACAB173ADA2C6A483176B8C97F66 /* Catch.swift */; }; 8FEBDE87BFA67E4AD0EC88774A1097F2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 8FFA3A6A77962B3A36B009A49634D081 /* MASHotKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CD9E0BB93F28FD91CBF8872501B7280 /* MASHotKey.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 911BEA57E7620828E28399C3CEC8C5B2 /* ObservableConvertibleType+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8209A41698505C3145781FDD26E699EE /* ObservableConvertibleType+Driver.swift */; }; - 92E02A303BB54BDFAED85930F2EC67A1 /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6573695D6E38AB0E45298916E5927F9 /* NopDisposable.swift */; }; - 92F332AD156F10CF4364BBDAD493FB29 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6180F60B96D97B62E15F102AA5722741 /* PriorityQueue.swift */; }; - 930C2D40D19017E7D8FFA0543F0DB97B /* Zip+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB6C8C0D1FA8537542033F55E1556F6C /* Zip+Collection.swift */; }; - 944C284C7390180088035BBE864823D0 /* SharedSequence+Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F9FB942372907FC74EEC9507F4F190D /* SharedSequence+Operators.swift */; }; - 9487C01FE68F38908090961512AA41CE /* ScheduledItemType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63D2A88D8F95FB962BFE6279B46169D6 /* ScheduledItemType.swift */; }; - 96A523A42595CFE0374C023A683B3753 /* RxTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = E67F34DCD8ADF524683B1FDA27AA87D4 /* RxTarget.swift */; }; - 9709A18386118371F2831A6080BE1400 /* RecursiveLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 881AB2BAED9DBD8D39A04DCCFD4A871B /* RecursiveLock.swift */; }; - 974D6C91F4DAF42C50352A2B1FD5BA36 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD930CE2472F57A003EF8907CA3116C /* Observable.swift */; }; - 977A3E71BC55F13D5D4D924BBA878872 /* ConcurrentDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C848585CA8A7F199434CE368A9DB06C /* ConcurrentDispatchQueueScheduler.swift */; }; - 97B374490F695A6ECB06271EF080EB6C /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 7EE2EE9316F755CDB7B2D29A98063559 /* nl.lproj */; }; - 97D7D5D14D02DDB584E54BA9878242AC /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66C68481E0A15400E90729E5B6E9C46D /* DisposeBag.swift */; }; - 99E95AAEC050D49A770629AA6B398C6D /* SynchronizedDisposeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCFC9D5177E577E082A70923B848393 /* SynchronizedDisposeType.swift */; }; - 9A551C74F80912EFDFC942535ECA28BE /* RxCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 533BCDFF477A8BB66A84035182761408 /* RxCocoa.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9B622302DDDA1881AC9ABA9EA4C81564 /* BRLOptionParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C85AD27621E054B8D7328ABDCB9697D /* BRLOptionParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9BCCF2D457FCA3F9A7688DC599FD32F1 /* Deferred.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CB5F5627B0B6D64308CD1A83ABB3B0 /* Deferred.swift */; }; + 8FFA3A6A77962B3A36B009A49634D081 /* MASHotKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BE1FB4F6E66271CE86F1B9F3B10C4B2 /* MASHotKey.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 9046C1C876045990B2EA13AAC3595F3A /* ControlEvent+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4E3D27538532E6FBE6335CF89442070 /* ControlEvent+Driver.swift */; }; + 91C0EF4EEBFE321C2F441FA4F4C11B10 /* Debounce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12173B3EF2DB80B33497504CD28D0D25 /* Debounce.swift */; }; + 92BA6B417A495F5740EE5C3C35CC86A6 /* SharedSequence+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = C69F2408EF8B0C3BB7419872996ED01C /* SharedSequence+Operators+arity.swift */; }; + 97B374490F695A6ECB06271EF080EB6C /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B2929F5EBA6B563EE116F09A01CE8D7B /* nl.lproj */; }; + 984CFED13106FED5980C072A6BE6A8ED /* HistoricalSchedulerTimeConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B61C725932BE55BD3F51C1611F4C00E1 /* HistoricalSchedulerTimeConverter.swift */; }; + 9A551C74F80912EFDFC942535ECA28BE /* RxCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FB4990CA1A63AF517A7F5A32C6EE3EB /* RxCocoa.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9B428D0BA1F182F5113B861921972176 /* ControlProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59CB3865143E8097440FEC7F48AF17D7 /* ControlProperty.swift */; }; 9DB91F7B392D045AB8451F515D20D649 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - 9ED2BB2981896E0A39EFA365503F58CE /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C3BD779374EECF9D6A500A90CF6279C /* AFError.swift */; }; - 9FA23568E21FB2B69B69DE816F0D8015 /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75828AB7420DC80FF4A055AD665BA0E8 /* Bag.swift */; }; - A197AB07449327D4540308FF01BC3C54 /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C2A8F904CF4DBCBEF9D102DBD74AFD /* Platform.Linux.swift */; }; - A1F4FEACF258A06986DEFA39C9FC32C4 /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = 326A9DBB817D95D4A5840B314BF9202B /* Never.swift */; }; - A295CF7A971C3F7D7E80AF27D4CEEB3E /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2B901654D7B257777782F6F00162843 /* Timer.swift */; }; - A2A6F71B727312BD45CC7A4AAD7B0AB7 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C9B2D9A28ABC58CFEE373E87A4052A7 /* NetworkReachabilityManager.swift */; }; - A4DBF0AB2E88B1A9D1078042F47618B0 /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 3CD46935CE54DAD2A7350CB2E4DB048C /* ru.lproj */; }; - A63F9CB6A170CE00FBD441E79DCCEE49 /* ShareReplayScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57B9A9B823D866CFD5C18A2DF4FBB883 /* ShareReplayScope.swift */; }; - A68383D073B808A27671BDECBC6A670F /* Sink.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1C50ACDF517D102DEC7195257ADFE7B /* Sink.swift */; }; - A6E3B7DAEEAC86F5517E5B10349EF854 /* ObserverBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52A9C2646B9718959021371687EE6250 /* ObserverBase.swift */; }; - A7FAD159116F1DBA5CD6E7B990C9A303 /* AsyncLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0EC4DF0E84A696168D1071B48A4F7F4 /* AsyncLock.swift */; }; - A8BA41C1262C1E9B84D4F744E00AF0E5 /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292363670323CC583F50A5989CC3D9D0 /* ImmediateSchedulerType.swift */; }; - A9EEEA7477981DEEBC72432DE9990A4B /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C163E270D8C0282204B45FA92F52546F /* Alamofire-dummy.m */; }; - AA3DEE3C7E1A806E5946C2BC01893808 /* Cancelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F0C0E792C43635C8DF0BA00874B14F /* Cancelable.swift */; }; - AA7CDF00DFA1EAFF7F28CAF33FE5BC37 /* MASHotKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 55279FD33E1F40398E20D7299953F40A /* MASHotKey.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ACBE29C4BF8BAEA483D6EEA940FE5314 /* MASShortcutView+Bindings.m in Sources */ = {isa = PBXBuildFile; fileRef = C8E1C61760F4B2BFEC652B9A01D4F846 /* MASShortcutView+Bindings.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - ACF6603E2EC6E8B13AC63123161CD195 /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B6B335F7D4B0FC8875810068B493F55 /* RxCocoaObjCRuntimeError+Extensions.swift */; }; + 9ED2BB2981896E0A39EFA365503F58CE /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 822A32C67318B2171827F9F276472026 /* AFError.swift */; }; + A03ADA7F9A7D390E62A9367B65B29D95 /* SubjectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CB0942D626105573A56A84ACEC555FE /* SubjectType.swift */; }; + A141E74893719F61806F5D6F6BF78A5C /* RxSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A10E8E2BEA43547BD31F4D396909B1C /* RxSwift-dummy.m */; }; + A27AE5C98C89D359EF8B6E8A6A0C805E /* RefCountDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F7B1AB25111B41EA516AC2B26F16FB4 /* RefCountDisposable.swift */; }; + A2A6F71B727312BD45CC7A4AAD7B0AB7 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F59435F621E888DE7C2D34F05907491 /* NetworkReachabilityManager.swift */; }; + A305AF2A15236E49B1F690DB9E8DEDB3 /* Reactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04D3D547F7C9D93D846B18B3598139D0 /* Reactive.swift */; }; + A47881E900B27D5C9E6201B96C6F9B40 /* KVORepresentable+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = E40D5C853F53872A9EDD51E2438864BC /* KVORepresentable+Swift.swift */; }; + A4DBF0AB2E88B1A9D1078042F47618B0 /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9C124E5083A1C670ECBA0CC803184E03 /* ru.lproj */; }; + A4DCFC022D92D0731971797EFFEE46DC /* SharedSequence+Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FF30D62954A12098DAC3C27FB43EC7E /* SharedSequence+Operators.swift */; }; + A66B49B60C9D0471B8E41130A01C1807 /* String+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B1C0E5A2AF56FCCFCBBA2373F04E7C8 /* String+Rx.swift */; }; + A7873C6DF1BF7D59F9412A098EFE1D7B /* TakeUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6756FEC1B269A6CF56EF4D67F08E050B /* TakeUntil.swift */; }; + A8DBD1857EC662A08D54BBA95E42E2D5 /* Completable+AndThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1FE5441218FAE87F6E57A87233B4A0F /* Completable+AndThen.swift */; }; + A903683F7163C5A9A7E5C592A1E46803 /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D17DBC203AF5B8E02A628E6920BEC64B /* RxCocoaObjCRuntimeError+Extensions.swift */; }; + A984AE396834F1EF8C1063A1B658151C /* Just.swift in Sources */ = {isa = PBXBuildFile; fileRef = F69A770E45055FD854F3FBD6979FC418 /* Just.swift */; }; + A9EEEA7477981DEEBC72432DE9990A4B /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 06FF1E1D8696715F0476C721349ABF4A /* Alamofire-dummy.m */; }; + AA7CDF00DFA1EAFF7F28CAF33FE5BC37 /* MASHotKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 14527C0C3B63CC337E971AE1EE047A07 /* MASHotKey.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AC297FE8A2A32B699310FD27F624C8C9 /* SerialDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 454DCFB400BFCA2DD8E4C2EC61190701 /* SerialDispatchQueueScheduler.swift */; }; + AC7D8A725626167C483F03B8BDBACF4E /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = A96B9F66608C047F1379AAE238F18C2A /* Reduce.swift */; }; + ACBE29C4BF8BAEA483D6EEA940FE5314 /* MASShortcutView+Bindings.m in Sources */ = {isa = PBXBuildFile; fileRef = 8090A9366A6F313575595425BA5B7C5F /* MASShortcutView+Bindings.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; ADE45FBACDF07286A544DC20605FE624 /* Pods-proxy_conf_helper-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CE50445A73ECB9A2ED31A6FF93D45808 /* Pods-proxy_conf_helper-dummy.m */; }; - ADEA4A10E5631586E27024F5D6478641 /* WithLatestFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524C8DBC63D366E5C0E8A5EA62713031 /* WithLatestFrom.swift */; }; - AE1EF48399533730D0066E04B22CA2D6 /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D436A58ECC98D13B9A4C91CD460DF93 /* SessionManager.swift */; }; - AF134CF20F447E0E0DAC073D73C7F86A /* AsMaybe.swift in Sources */ = {isa = PBXBuildFile; fileRef = E58A2330CC4D40F78DD08B5A8500F8BF /* AsMaybe.swift */; }; - B0D6D07A3329617011E4220080E157C0 /* NSLayoutConstraint+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C3FED0A19AFEE0E97C077B535ABB44E /* NSLayoutConstraint+Rx.swift */; }; - B25F18CA3C510C41288D907933124619 /* NSButton+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FD7A0DC3ED806805A328B6E3183B3DD /* NSButton+Rx.swift */; }; - B65FCF589DA398C3EFE0128064E510EC /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0AC98004CCEB4CC8A5BECA09878CAA /* MultipartFormData.swift */; }; - B7EF65DA3A34ABF3B41F50ADCD198BDC /* GCDWebServerFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = E9DD9AF410C94A598B2DE06E014C5DF0 /* GCDWebServerFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B8580D2CE60303378BFD4FBA2C6F23A7 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41DAD2203618169F641D264D7C2EE0E6 /* Error.swift */; }; - BA465CDF798AEFDE90A8C0CAAA1B1098 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92244CECCE7B444FAB2C8202E5EA4056 /* Disposables.swift */; }; - BA4E2E5784DFEA8CD5D09039B9B465A6 /* _RXKVOObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1E04FFC51E6E05C344477E8DDB777E /* _RXKVOObserver.m */; }; - BA510AF8040C827F56166B707BE76626 /* Variable+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7206D6A8DAD7ADCD7E85D9D080C6BACB /* Variable+SharedSequence.swift */; }; - BB397F55B0307FEDE4828D0092658075 /* RecursiveScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6B7FB2F3741600EA98ED059FA99D203 /* RecursiveScheduler.swift */; }; - BB5641E2D7D16938833681670A55667A /* KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF0A1029048B0747EEF9A0E552FE307 /* KVORepresentable.swift */; }; - BBEFE2F9CEB73DC7BD97FFA66A0D9D4F /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F452BDEBCDC82858ADCB26071AA4E12D /* Validation.swift */; }; - BCB03A46BA9CA1A4D1A7539B2D6E5E1E /* ImmediateScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A97F155FCEA6B4942A94BBB31544107 /* ImmediateScheduler.swift */; }; - BCEDD2079F8697D75351BD8880AB5F5E /* ObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F9BA2F71CB99026197CB42B356FC63E /* ObservableType.swift */; }; - BE5C67A07E289FE1F9BE27335B159997 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44D9192CE046EB20FAF1BF26C3FC60FC /* ParameterEncoding.swift */; }; - C06EE84D23391E9FA94864DEDE34F548 /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5603B5E9D6CFF759B07667A13C90112C /* fr.lproj */; }; - C1E7BF810B8A08D68980DEF88FB818AC /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC25AF2EB8052CF4B0A98541C78FA86C /* Queue.swift */; }; - C24B87BB347D484FE80D05B81B7BA225 /* SubjectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15DDA519B43F0EB8DFD887D2F7A6FA8A /* SubjectType.swift */; }; - C364D9BE7F85D4001B8E8F1C6EF4B1CA /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F37E66B5A8F3C680354C935F2744C29 /* Repeat.swift */; }; - C47548C9A021ACE578E56C5825C7049F /* SingleAssignmentDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2EA7252711AF3E4D70DD2035DA71438 /* SingleAssignmentDisposable.swift */; }; - C50FA5B211B8916770FBE55623B83DA4 /* MASLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E128ED33CF5ECBE9E08D07D4B7672D /* MASLocalization.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - C672608508D0E7C39889E96D744F48A0 /* SkipUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2487CFFD3F6BA7CF97A97003B1727B18 /* SkipUntil.swift */; }; - C96E54153198E59FF0F8B9F7408523E0 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = FC3F16342AABB95F2FB9FC98E52CF43E /* GCDWebServerDataResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - C9C6EDFC3305BB433A24F269C643AEFF /* RxCocoa-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 321FFBA726A46A7C54E164E625D44DED /* RxCocoa-dummy.m */; }; - CA01E0AE4F5FE45BB3AA2E55D99816F6 /* RetryWhen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B264AC163CEFA27D7ED08507B018B11 /* RetryWhen.swift */; }; - CA811C461085BCD75D8B606661C2AD73 /* AnonymousObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D280C7FCC6AE30E6F8430DBA380925 /* AnonymousObserver.swift */; }; - CB6D60925223897FFA2662667DF83E8A /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 996FFF36FA1A968D9BC5367C870F15F0 /* Response.swift */; }; - CCEDF6CBEF930200FC7775BA39573BD6 /* LockOwnerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7CDCDB0682EC04C12DD552E4910CE5 /* LockOwnerType.swift */; }; - CD66165D619F2CFA447BB599817305F1 /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = A102F9379F5A55F3D3C85A1FB3687F97 /* Map.swift */; }; + AE1EF48399533730D0066E04B22CA2D6 /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DD3EF9C6F47C3257FC0151069723CD1 /* SessionManager.swift */; }; + AE4469ABED69AF5CCDA9F79F39CEC4D9 /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40EA3D109B9CB1C1BBDC2E9255B38366 /* Never.swift */; }; + AEA4F5986FE7926A033E0AF86F931282 /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A5F9295B64270BDF4807BAED9FDCCF1 /* Platform.Darwin.swift */; }; + AF9067B9CDA7BD3E92AB740E2B4D4313 /* CombineLatest+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53901D4BDA021937287E33B4491AA200 /* CombineLatest+arity.swift */; }; + B09D2E9A8525D7217DA1233D0D3D3163 /* BehaviorRelay+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51EC586F86D6864B74B5211875AF2253 /* BehaviorRelay+Driver.swift */; }; + B253253B456FF86F30E0295D61253313 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AECFBD9B4972BED36C6D3ACC0177E0E5 /* Observable.swift */; }; + B2D921758B432E5510A4916377700E9C /* DelegateProxyType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F9FFF0AB40ABBC9CD22047B6E5CC748 /* DelegateProxyType.swift */; }; + B2E47D0CDCC58CD8D3193EAD385B3D54 /* RxCocoa.swift in Sources */ = {isa = PBXBuildFile; fileRef = 729746443824EABA89E3E1088EB4F53B /* RxCocoa.swift */; }; + B5B98C960E1620AF04F5EB54A6F94060 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91E0555770D3BEC1183279EBBF63B6EB /* Switch.swift */; }; + B5C5B8AD50BA9EF13CF2FCC39D233BEA /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B234AB54ABD1C374D34665C3DCD649E /* DispatchQueue+Extensions.swift */; }; + B64418D3CA2AEEF18D0EC5AD9331418F /* Do.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3413B9348C850EE5AE49C8B95B12943D /* Do.swift */; }; + B65FCF589DA398C3EFE0128064E510EC /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970A1485E6688625754970DC8BBC7072 /* MultipartFormData.swift */; }; + B6B64BA6DF509EBBCDDA2E3D0FFD15BF /* CurrentThreadScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 938FC605EEA4041CA074FE17C4D53535 /* CurrentThreadScheduler.swift */; }; + B6D7EC205EBE545C0FFC283C99959B88 /* ObservableConvertibleType+Signal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D3CF439796CD1B84572CBCBAAE5BA9 /* ObservableConvertibleType+Signal.swift */; }; + B7645B89B4EA9E40E73FE8453A104EEB /* ObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF3BEDFBB2197809F6BDAF649F36F20D /* ObservableType.swift */; }; + B7EF65DA3A34ABF3B41F50ADCD198BDC /* GCDWebServerFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 1056A640AEFE50B38D2344C0B944DC50 /* GCDWebServerFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B8B5444B935D4EB27FB9043B91B7051E /* LockOwnerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2F7E00EE5AC554A4695B58D3E0EEC68 /* LockOwnerType.swift */; }; + B9ABFFC64C4C6D69E54B241E66628A05 /* RecursiveLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = B55BFBC972E986BB01725A95A9860DA2 /* RecursiveLock.swift */; }; + B9C213FE3345C49943F292D94145CBC2 /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88AACF5B7E188D3448847253899BFC8F /* Delay.swift */; }; + BA323A31F89C4B1236C98E5E097BE573 /* PublishSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79369DACA0CF3D56E9D4D213125DD2D2 /* PublishSubject.swift */; }; + BBEFE2F9CEB73DC7BD97FFA66A0D9D4F /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEF0E141DA73C02E3495E9BC4F3BCB79 /* Validation.swift */; }; + BE5C67A07E289FE1F9BE27335B159997 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C658B994B5D0A61D71450AAF4863AC8 /* ParameterEncoding.swift */; }; + BF4EBAA751C53BA5462FF75957BF1A89 /* Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3031DA85910A1DEDA7065204F6B9BBE1 /* Deprecated.swift */; }; + BF9A718095FF8B6D50B86CE5E49D2806 /* Enumerated.swift in Sources */ = {isa = PBXBuildFile; fileRef = F77DE488C839A9ACAE7A7BF4C24036BC /* Enumerated.swift */; }; + C05242C7AD45BFA7D14EEA269E8F77F8 /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5ED856E0033C185BB3A1CFF513A42C /* Bag.swift */; }; + C06EE84D23391E9FA94864DEDE34F548 /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 68B50473C6A5B2B637DC2178073B139B /* fr.lproj */; }; + C35E5A2FB5AF7879770EA0DFF62DDB8F /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 466571AD788ED5DE02B15FD2D5AB0E3D /* PriorityQueue.swift */; }; + C3DE1F5F412BB52D0D46E179A69B0D58 /* AsMaybe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0C71FC59A714120E705919A119EB9C /* AsMaybe.swift */; }; + C3E79028E8D9C078CCC8F7B5F6B63624 /* SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68A72BF8AF1DC1EC8C18BFA79BE3799F /* SharedSequence.swift */; }; + C48FFAB1DDCF9FDEE249D169DD3AB317 /* NSTextField+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877FB023C6C79A9CB7DD34AAFEEB6434 /* NSTextField+Rx.swift */; }; + C4BF841C95A8E72CC6FF74F77BD92F0C /* NSButton+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB8175F2ECF55A3974C3B9F8F610B7E4 /* NSButton+Rx.swift */; }; + C50FA5B211B8916770FBE55623B83DA4 /* MASLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DA5EAC6F4067B7529AE728323D52317 /* MASLocalization.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + C5ACAD7575831DEE4FF98E4372CF0BEF /* SchedulerServices+Emulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E356F07902E984F6D1B28C8BCA923455 /* SchedulerServices+Emulation.swift */; }; + C6B65F4F3D935F320EB1186D15FCD725 /* Sink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88AC45588E239E491BA98259039A6802 /* Sink.swift */; }; + C7E42F03821DCAD169FB9E5C2663C873 /* _RXObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = AE6FE24DA6B6C599439A0CD35E6C0C39 /* _RXObjCRuntime.m */; }; + C96E54153198E59FF0F8B9F7408523E0 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 25BD92FA972425CD9706F8177394D7DF /* GCDWebServerDataResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + CB6D60925223897FFA2662667DF83E8A /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 874D86BD8C4CCD8EC1708994A7C75D5A /* Response.swift */; }; CD97073476795E5EAA07C91A7F7890D2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */; }; - CE270F335D051643A45CCD09FD203831 /* GroupBy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51807E4919B34213B8F47CD576F3FC3C /* GroupBy.swift */; }; - D2B04C075D6CA6AF10C35D8BF7DEF0D3 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = D1C4C6CEAFF5B39F833B3836EAAEC96C /* GCDWebServerFileRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - D504CD5DE30A8ECF7B12BAD77637E8C5 /* String+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C5D99ED4F07DAF3A50F59C765CA416 /* String+Rx.swift */; }; - D568BE9017C4ABC2EBC93B55568FA818 /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5548D8C229700A0AEB23E7B56630426B /* RxMutableBox.swift */; }; - D63E514E26A060F7C90A92AE8E9B49F9 /* GCDWebServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 44F322EFF3BACA5D7D9D859973112A90 /* GCDWebServer-dummy.m */; }; - D6E2F0BAD0C15F29CBEA69E2A6B78DA2 /* SerialDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBA0B69E87685AC3D2B60EF632158AE /* SerialDispatchQueueScheduler.swift */; }; - D6EA93219364CDC135BAFE63084F6361 /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F3C425613054D6B8A7DFF96BE0698489 /* es.lproj */; }; - D7524216B4C0994A50624825DFB7CB6B /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = A30C48C8ED1D9EC8231B3D871BC285C7 /* GCDWebServerConnection.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - D7681A76A0F47EEB17E16A5D28BD125D /* NSSlider+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F67068FE91E63222D2D32C4BB3BBCBD /* NSSlider+Rx.swift */; }; - D7B87735E689DBF9F8CA42227B8E6B88 /* HistoricalSchedulerTimeConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8C09387A31AC5BF4B190F880F4883D /* HistoricalSchedulerTimeConverter.swift */; }; - D81001368F100460264962569F099802 /* KVORepresentable+CoreGraphics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261420BDDFD507E93CA5EEE0286F0D2B /* KVORepresentable+CoreGraphics.swift */; }; - D98FC1E3FC63DFDC89218E02603C0531 /* RecursiveLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF7187DD22E17C86AB22B3969936E90C /* RecursiveLock.swift */; }; - DA1B86D493CD8111AFC476D0EEDD498A /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9480F95CFFC2D8DA4D91AE587BFF20B8 /* TextInput.swift */; }; - DA3CF2B75F35BF67169C4A938A21526A /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 646E91BE14388979C352F573B4362A39 /* SkipWhile.swift */; }; - DB94D782C6F193FB6F56D52926F2A84B /* RxCocoa-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 99EEC612B008B452C8ACD615123EDA93 /* RxCocoa-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DCE20142AF8D357B7CCEBBE021148310 /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF6DC4F50F673F957821F727AF12A71 /* DispatchQueue+Extensions.swift */; }; - DD44780BE73F9964BC370A525CC14E25 /* ReplaySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2946829864608D127EB046EF8BAA69D /* ReplaySubject.swift */; }; - DE24C629B3DB152EE4924B56E3CC59F5 /* pl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 6786640F8B195A8E8E18BE5034B98BDD /* pl.lproj */; }; - DE68B3E9BA04A5DEA59697E2828E90A8 /* Dematerialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = A023097C535D0BD3D56EA8BD993D7B3F /* Dematerialize.swift */; }; - DF2762B53F71DBC62F8CE6D5A89E7461 /* _RXDelegateProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = D9EBA3D67FF4AF63397A5FB0F6CF1B5F /* _RXDelegateProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DFA6E4455415B3EB3BB38A9F48EEB044 /* Shortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = 68FC88BF39528F8F3D69BD6D8964B5A7 /* Shortcut.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E034B9A4E3D86C8D49371909C2D49480 /* SectionedViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82B6A945EDCE3039C33A744E0206424D /* SectionedViewDataSourceType.swift */; }; - E15C2441B7387415553D7A7C0BEEFF87 /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA271EB6661517D11AE48621699B565 /* ToArray.swift */; }; - E3D6E1B68331D777282FD8CEAA4F3625 /* ControlTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C165CADEE8873C8F5D15A02BF1AF555 /* ControlTarget.swift */; }; - E5055E923CCD18C703DD0464379D5075 /* Scan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 023DBF06ED50965F68CFB72972CC89AB /* Scan.swift */; }; - E5312C0FED7C61135F252D3A7A112990 /* MASShortcutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 687C69F6237AA7E984907EBAB8FA2B02 /* MASShortcutView.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - E560A21728B29AF234BD0F37AFE16F36 /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = DCD30248F27B4938679C37883BDD134A /* en.lproj */; }; - E62DD91C60246BD1E4E8A0AF5D7BF0E7 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 572BE12282110872C7D8E7EF29A5033C /* GCDWebServerErrorResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - E630F719F45F55F60395139F462151E2 /* Create.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DE8782EF7863C69F019CB969C665C2 /* Create.swift */; }; - E66F7AFACFC665B23022A09E46815B5C /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 48930EE93B15635DB1DC641A949AB58E /* it.lproj */; }; - E8C85C07DF36B6274953F0D8C3BD0771 /* Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 000B7BC80F254E06ADEC25B19B7C2C37 /* Timeout.swift */; }; - E925A3CA1CEE77BDCB0CE04E46FA9EB8 /* StartWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A4AEAD1EF447DFE90F59D1059C79B7 /* StartWith.swift */; }; - E93BDF607D1A682D01B2DDBC0E99859A /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23C70F218FD3D53D1E083383A8C8225 /* Range.swift */; }; - E97573A653DE3A4CB8BAC26FB7B3E9A9 /* MASShortcutView+Bindings.h in Headers */ = {isa = PBXBuildFile; fileRef = 01A59C606077EB80665FFDDD235664B3 /* MASShortcutView+Bindings.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EA6D2E46B967F447FFC46520EC328B5E /* GCDWebServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 2738692BF965EDDE0CDA5B4D08899095 /* GCDWebServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EB58AE5225AEEA217C860F6D6E558E20 /* RxCocoa.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9487D19A313750E8B3F0DDB32B87E864 /* RxCocoa.swift */; }; + CE3433577AC6A3A699828941BED494AD /* InvocableScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1384B3A09ECFD78F3EFC1FE31AF7DE8D /* InvocableScheduledItem.swift */; }; + CE72C87BA2E459F034007E66425F212A /* Maybe.swift in Sources */ = {isa = PBXBuildFile; fileRef = F735EC7A418D45C70CE0818AC93B4BA3 /* Maybe.swift */; }; + D047C60851BFC9D2C493A36A4EF177E6 /* CombineLatest+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = B98A2E7455847993E52C3245DF62ACCE /* CombineLatest+Collection.swift */; }; + D14843F20202C1CD6FC26520F816EC1E /* NSObject+Rx+RawRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B4668396025D7B53E3928CAD15C1E28 /* NSObject+Rx+RawRepresentable.swift */; }; + D2B04C075D6CA6AF10C35D8BF7DEF0D3 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 125D906DA6D12CC4B558691B8F324B0F /* GCDWebServerFileRequest.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + D486060C6A0F9300A1680DC208841BE8 /* Bag+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDECDC826427AB1333B1485F32A721A3 /* Bag+Rx.swift */; }; + D491E71A28D78BC00368C3F5EFA16EF6 /* NotificationCenter+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAC7C3176AFDC0CD3DD5D9184E33909 /* NotificationCenter+Rx.swift */; }; + D4A99917EBD151044BFA8E751E1250E7 /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C4B04EEA1AC1BE33D71036DEBEBF937 /* ObserverType.swift */; }; + D5AD134F7DB2BF3A1ADEAED307320E0F /* NSObject+Rx+KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFF605517B8B672280D85EF59BDBBF89 /* NSObject+Rx+KVORepresentable.swift */; }; + D63E514E26A060F7C90A92AE8E9B49F9 /* GCDWebServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 549C9311455C020E76C0D8304E77DCBB /* GCDWebServer-dummy.m */; }; + D698FD4BE7CDC647AF0875009AEF8F75 /* Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91CE07E2C296F1B3388DC2668BAB1341 /* Zip+arity.swift */; }; + D6EA93219364CDC135BAFE63084F6361 /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 517A68D17E290C18DFC53F4AECCE8C21 /* es.lproj */; }; + D7524216B4C0994A50624825DFB7CB6B /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = B458372D1D2009A7FDC10C7A5379CF07 /* GCDWebServerConnection.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + D80D125190DBE2395B2038A0E58CE8B1 /* SubscriptionDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6958C5792CD090D53D51F45E3FC8391 /* SubscriptionDisposable.swift */; }; + D9C652378242BAE39E7190AB1479615D /* DefaultIfEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13F2EDEB0AC07D152FC818243513146 /* DefaultIfEmpty.swift */; }; + DB94D782C6F193FB6F56D52926F2A84B /* RxCocoa-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B8FB3328120B8DA4A4A0E2CA1B29F188 /* RxCocoa-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DD0FAF2DB130AB4B3459135864A9A8AC /* Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF97805B59E93B8CDD1F35ADC2C1160C /* Timeout.swift */; }; + DD8CC605B5F5ADD0C2AE422ACCC55F1C /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239930698028F8A7F8F0AF8660885A40 /* SingleAsync.swift */; }; + DDE3C9634B3BA4568D8BD96898046373 /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7C21F7B579D31839F9317289084E4FA /* RxMutableBox.swift */; }; + DE24C629B3DB152EE4924B56E3CC59F5 /* pl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 01EE31460870DAFD92CCDA3D6C827B67 /* pl.lproj */; }; + DE92C75444AC6056D4B04914CCE93EF9 /* Using.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA32EF7645C489DC5E33892504DE253D /* Using.swift */; }; + DEB685D908D2D7D908A292A761456A8F /* ObservableType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48320B8075CDD3A66743F2FB1C0AEE97 /* ObservableType+Extensions.swift */; }; + DF2762B53F71DBC62F8CE6D5A89E7461 /* _RXDelegateProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = BD319BD2D6840013A6DB5A5E61C57FD6 /* _RXDelegateProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DFA6E4455415B3EB3BB38A9F48EEB044 /* Shortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F7E8032E1CE431DD241906525558580 /* Shortcut.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E00B7623181A63716524D50FB52AF9EF /* ControlEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EB40302AC6F385C4C11271681C7BE07 /* ControlEvent.swift */; }; + E0FF2B53C79DE29F557295CD66849772 /* CombineLatest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 812492787E3005F375F66430EEFEB2D3 /* CombineLatest.swift */; }; + E1D2EC0D3A8E1454CA8723F3DB19BEDD /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4591C0BC6376C1566FEA09D9C716AB84 /* Window.swift */; }; + E25A92CC625C9F817B6E30D8BA3FA362 /* MainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CF4A5D83CF4FF7422C8E7F007410BA4 /* MainScheduler.swift */; }; + E4C1BCACA652B5F16936BD89A8C8F298 /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 257A51892B0489327105FAC5C85056BB /* ImmediateSchedulerType.swift */; }; + E5312C0FED7C61135F252D3A7A112990 /* MASShortcutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 02C042C63C5C999AF2FB0BFB90543584 /* MASShortcutView.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + E560A21728B29AF234BD0F37AFE16F36 /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 59F05446C5A1EF95AA5BF54D2E7130C0 /* en.lproj */; }; + E5A9C51D2B5CBE025C396CDEB5900BA2 /* SectionedViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6162331FD69499451313416F088EB1C /* SectionedViewDataSourceType.swift */; }; + E62DD91C60246BD1E4E8A0AF5D7BF0E7 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = DB7869CB7726942306727ACBE0A6CD4E /* GCDWebServerErrorResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + E66F7AFACFC665B23022A09E46815B5C /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F79B729FCFF408FC35D4D736823C9C54 /* it.lproj */; }; + E97573A653DE3A4CB8BAC26FB7B3E9A9 /* MASShortcutView+Bindings.h in Headers */ = {isa = PBXBuildFile; fileRef = 173CDFE8FFD9A8EF4825486DCB53A7A4 /* MASShortcutView+Bindings.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E9BA2F04B8242EBC70AD366755DDE682 /* AsSingle.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF2D048928B85C0B72DFDA760FAC837E /* AsSingle.swift */; }; + EA4470F28E55838D29E625ED1F2EDCA5 /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E8515AADD6430481FAC8F2DD92FE0F8 /* Bag.swift */; }; + EA6D2E46B967F447FFC46520EC328B5E /* GCDWebServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C34C0B46CA55D9826447C6EF5667B77 /* GCDWebServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; EBEFF85070E25F0A581B7BA1E08138AC /* Pods-ShadowsocksX-NG-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 24B01D81E3D7058FA14A053EC19874D0 /* Pods-ShadowsocksX-NG-dummy.m */; }; - ED04D176C26F6B4DEE23810B8B7119B0 /* PublishSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D3408600A2042F4070CA97A67C60D5 /* PublishSubject.swift */; }; - EE3A79FAA60A198321767854B60B772F /* MASDictionaryTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E29C34C13007B34D5420BE9284FDCB0 /* MASDictionaryTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE8586A641E4CB0201D2563B1EEA6C41 /* Variable+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = A040CC73BFCA8B9320CEF555F949D711 /* Variable+Driver.swift */; }; + EE3A79FAA60A198321767854B60B772F /* MASDictionaryTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = E66E142759BB10864774D2C94E961514 /* MASDictionaryTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; EE85F313D5EC70842C812EB16038F4F2 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EFD468F10CD22B3EFAB406DAC3FCC7C9 /* Carbon.framework */; }; - EEAC0241CA98FB00547A1FD43393919F /* CurrentThreadScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C50B5D873459E5F93927D1EC6F3505 /* CurrentThreadScheduler.swift */; }; - EFD264FC408EBF3BA2528E70B08DDD94 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31EB405D095DCBF9C17B60786F115283 /* Notifications.swift */; }; - EFFA4247C90B98FD9160F30905A64569 /* cs.lproj in Resources */ = {isa = PBXBuildFile; fileRef = D998C21F60B248C532A1ED016B5074E7 /* cs.lproj */; }; - F0B96041A73DA23E9D262BA15C170D01 /* ConnectableObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 007948A0B78DA5B2FBD4E8DB9D2029DA /* ConnectableObservableType.swift */; }; - F1409EACFA70BFBB14D0661A2A64A086 /* Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FD63BE80EB7AD180525F89009471D6D /* Optional.swift */; }; - F2853E97BDDC82B8F91AE2954D27F775 /* RxSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D6FA3B372E3D1861300774D9CACD4C15 /* RxSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F2FD100BE6F84972590D979D42ED4FC4 /* Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BC03B0B3ABA0DCA68E6E5743698D228 /* Deprecated.swift */; }; - F312C5B4C0D22FF4F993AF7F797EE199 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD0CD5DD6E42873872D2B73A60081FD0 /* Debug.swift */; }; - F359857602B1D4C91B4AC3D1A2CDFE1B /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FB611A2D6465F53874DE91ED2D760BF /* GCDWebServerFunctions.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - F3C6B978DDBCC0E699D26D119B572EAE /* Driver+Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30FAB42EC783B04EAEDCA833EB48269E /* Driver+Subscription.swift */; }; - F44386819D44846A436139CEF3D372A5 /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8700E99248E4432CC4DC446DE4A91E41 /* zh-Hans.lproj */; }; - F5C76B37D1C8E6738569F7AA3D40F916 /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82A11977CDF4CBC2948546163A27853 /* InfiniteSequence.swift */; }; - F6BECD98B97CBFEBE2C96F0E9E72A6C0 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BC3FA38663D9266B6B5D834492C9F7A /* ResponseSerialization.swift */; }; - F705D537791FF5B259AC2BED6619F784 /* URLSession+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02D69B5B9B62BE6A7900C1039EFEA2BC /* URLSession+Rx.swift */; }; - F8815ECB42FCF09BBC99D3730DFD577C /* MASShortcut.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 288F0992DFCC5E6027AA31FD385C34D6 /* MASShortcut.bundle */; }; - F8B3D3092ED0417E8CDF32033F6122F5 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADD97D49C025DAFE6EE85E866D134966 /* Alamofire.swift */; }; - F8F408461A74E2DD1C2F52EB5CE75DBC /* DelegateProxyType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 863E188823EC0A70B5265256ECE53AA4 /* DelegateProxyType.swift */; }; - F94ACA6AA0DD416E5BF05E2425E5F2A6 /* MASKeyCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = 77903B50BE4AEAB8D9679B1978D574DF /* MASKeyCodes.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F9A0498BD9162FE8DB33FEC0C34799B2 /* DispatchQueueConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B38DD11A907BC6F5B45FBB0A35B0C /* DispatchQueueConfiguration.swift */; }; - F9A083E8499E3D6FD016386EFF9077F1 /* _RXObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 986B511A99FF2CD40FF4907FE5DBAD8F /* _RXObjCRuntime.m */; }; - FA47B9CD9D97967860D670B13698860B /* RefCountDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4DAA5324C3F0718C4CC7852CBAC50D0 /* RefCountDisposable.swift */; }; - FAAEF6075FA56D6420B259CB55DE44CD /* Reactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDE1BDB4BDD14E3E8B8C3F8ED3B3C53A /* Reactive.swift */; }; - FBA9A81E2370D564461112665A0C3B6A /* DistinctUntilChanged.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0D57732901E7827AB4442A3185E7287 /* DistinctUntilChanged.swift */; }; - FBF219CBB84DD6F373B818708C889C9D /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = A9826B12E4E987A2B073DA6D32BBA53C /* GCDWebServer.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - FCE19FE31F220BF73A655705230D794B /* Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF81F74434BA7B8FAE460E710314428D /* Deprecated.swift */; }; - FEB827276214371B67B303805489B87A /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E95ABF737E8C0AF728AE99576593651 /* ScheduledDisposable.swift */; }; - FF59638AD925FD4B1E22F7CB3B404881 /* AnonymousDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7959286D1E30292AB76348C2712DE95B /* AnonymousDisposable.swift */; }; - FF647F4502B0AE29095FA14A256612EE /* _RXKVOObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B31A4E3C1E226E2FB724AB96C882B5A /* _RXKVOObserver.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EFD264FC408EBF3BA2528E70B08DDD94 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1325C66E30F87E4F665AF154722DABD6 /* Notifications.swift */; }; + EFFA4247C90B98FD9160F30905A64569 /* cs.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5CC3D4BB2BA8F24225B176DDE03F8307 /* cs.lproj */; }; + F00844DA1200A12EE14C14E23E2BC859 /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29D5C9E52C36A6630A4B5F4A54F3666E /* ScheduledDisposable.swift */; }; + F03E764DDC08BFFE403CDE649961A182 /* Create.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABE0B812B00B54AA2F6982337A7172A2 /* Create.swift */; }; + F233490E2120C2D6637CB3F6F8737F5A /* Zip+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C558DBA8867D3525206597226AB7FEAC /* Zip+Collection.swift */; }; + F25EB58E105AFB65A62E5B4D670EC3A4 /* Amb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FF0F128359723A54E21FEBB2D99C657 /* Amb.swift */; }; + F2853E97BDDC82B8F91AE2954D27F775 /* RxSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FBC4E57263B9AAECCE6AE5CA60FBB422 /* RxSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F333C550B300576B6D1872CEBF2DCA56 /* Skip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091B320AF46DFF5E52B1CA91938163BC /* Skip.swift */; }; + F359857602B1D4C91B4AC3D1A2CDFE1B /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 78BF2C0D1D2976671C6F01E7CF57B7D8 /* GCDWebServerFunctions.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + F3C91131A98744C6A84091DEBE562A83 /* Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37302F3E1098B88606F9963B2BFF7A3F /* Rx.swift */; }; + F44386819D44846A436139CEF3D372A5 /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E66FAB44C7A517141189FD000F9B5DF5 /* zh-Hans.lproj */; }; + F4E2663E1F8C4822B9F1CB7DF2D20D49 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33710F9F62AA2B36412EA7B08233352D /* Debug.swift */; }; + F6BECD98B97CBFEBE2C96F0E9E72A6C0 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E17FA1477E37C745A33298D5655B877 /* ResponseSerialization.swift */; }; + F765730BADD93DCC345E2DE56E6C62CA /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9445256D5E0C36ADD934F62A67B04A09 /* CompositeDisposable.swift */; }; + F8B3D3092ED0417E8CDF32033F6122F5 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11C843F0A8CC61D5B0B5CCFFC9B6EE77 /* Alamofire.swift */; }; + F94ACA6AA0DD416E5BF05E2425E5F2A6 /* MASKeyCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = 814650269499C22D7A00826E5401B231 /* MASKeyCodes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F9E086C2872C233495E02147B2EB4115 /* DelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC38924038209EE8DA70D12014386B4 /* DelegateProxy.swift */; }; + FB6F90016D5931C84A6C6246AA8FC589 /* Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EC9ECCC54FEA683BBDB8B5CD94124B1 /* Deprecated.swift */; }; + FBF219CBB84DD6F373B818708C889C9D /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C34DF9211C78641101C8029D821282C /* GCDWebServer.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + FC370E0DDDC82C67228A592097A39548 /* PrimitiveSequence+Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24D58CC8AA50BE13352501DE5BA68B94 /* PrimitiveSequence+Zip+arity.swift */; }; + FCD2C753E6D8C65EBDC798994D1CC902 /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94342D18D6FF2890EDEEBE3520A6E66E /* Repeat.swift */; }; + FCE8C2F9D08C36D48A6423761DEF3072 /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B790A80F95F23886D51E59CA3075E0B7 /* DispatchQueue+Extensions.swift */; }; + FDACBD92C66F0C5D0F33FD059BCB35FD /* _RXKVOObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 0137F5061A6992367D3A03EF05697F7C /* _RXKVOObserver.m */; }; + FDD7A9BACD4F983FAF4443179C5DD53E /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294B1F176E9A1CBCB03CF68E8A428BFB /* NopDisposable.swift */; }; + FDF45F406FE3B124880C5ABD4FC68FF5 /* URLSession+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD54960D651138A3CA4F03327ED04C1E /* URLSession+Rx.swift */; }; + FF48776622396EC0C1D7776DF09781EE /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DF905835162609C61FE7431CEAEFE06 /* Map.swift */; }; + FF647F4502B0AE29095FA14A256612EE /* _RXKVOObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = A35868FCBD5266D702CEA4A6E65DF160 /* _RXKVOObserver.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -383,367 +395,379 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 000B7BC80F254E06ADEC25B19B7C2C37 /* Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeout.swift; path = RxSwift/Observables/Timeout.swift; sourceTree = ""; }; - 007948A0B78DA5B2FBD4E8DB9D2029DA /* ConnectableObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservableType.swift; path = RxSwift/ConnectableObservableType.swift; sourceTree = ""; }; - 00CECA213B3AA462DCD88A69F686C862 /* GCDWebServerMultiPartFormRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerMultiPartFormRequest.h; path = GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h; sourceTree = ""; }; - 01A59C606077EB80665FFDDD235664B3 /* MASShortcutView+Bindings.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MASShortcutView+Bindings.h"; path = "Framework/MASShortcutView+Bindings.h"; sourceTree = ""; }; - 023DBF06ED50965F68CFB72972CC89AB /* Scan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Scan.swift; path = RxSwift/Observables/Scan.swift; sourceTree = ""; }; - 02C96012B347BB2E33A987A213CA57C4 /* ObserveOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOn.swift; path = RxSwift/Observables/ObserveOn.swift; sourceTree = ""; }; - 02D69B5B9B62BE6A7900C1039EFEA2BC /* URLSession+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URLSession+Rx.swift"; path = "RxCocoa/Foundation/URLSession+Rx.swift"; sourceTree = ""; }; + 00208F1C08F49846BFE1A47C2AD5C562 /* GCDWebServerFileResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFileResponse.h; path = GCDWebServer/Responses/GCDWebServerFileResponse.h; sourceTree = ""; }; + 0137F5061A6992367D3A03EF05697F7C /* _RXKVOObserver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXKVOObserver.m; path = RxCocoa/Runtime/_RXKVOObserver.m; sourceTree = ""; }; + 0141E6A6B4EB3619B0171F6D6AF2EE49 /* DispatchQueueConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DispatchQueueConfiguration.swift; path = RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift; sourceTree = ""; }; + 01EE31460870DAFD92CCDA3D6C827B67 /* pl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = pl.lproj; sourceTree = ""; }; + 02C042C63C5C999AF2FB0BFB90543584 /* MASShortcutView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutView.m; path = Framework/MASShortcutView.m; sourceTree = ""; }; + 02C1C424F1F955C157E2AD0DF9DA85CA /* GCDWebServerResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerResponse.m; path = GCDWebServer/Core/GCDWebServerResponse.m; sourceTree = ""; }; + 03F1DFC052C8E6481E56E12D5099A620 /* _RXObjCRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXObjCRuntime.h; path = RxCocoa/Runtime/include/_RXObjCRuntime.h; sourceTree = ""; }; + 04BAD8299F0B7A65CFCE251F1F7722C0 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Alamofire.modulemap; sourceTree = ""; }; + 04D3D547F7C9D93D846B18B3598139D0 /* Reactive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reactive.swift; path = RxSwift/Reactive.swift; sourceTree = ""; }; 054C3E84057CD06DB85D99E7AD207F48 /* Pods-proxy_conf_helper.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-proxy_conf_helper.debug.xcconfig"; sourceTree = ""; }; - 0598B496AD3E8300228BC3050091C4A0 /* MASShortcut.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = MASShortcut.modulemap; sourceTree = ""; }; - 07BCC46A8B3A4B93914CB0C0624B3942 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; + 06FF1E1D8696715F0476C721349ABF4A /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; + 0716C7A069A21844C312E62BBD3AC258 /* SynchronizedOnType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedOnType.swift; path = RxSwift/Concurrency/SynchronizedOnType.swift; sourceTree = ""; }; 089EB7E66F64D3A19BB7681AFCE91031 /* Pods-ShadowsocksX-NG.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NG.release.xcconfig"; sourceTree = ""; }; - 09187F1FBD16DDE0A198691271E6D322 /* GCDWebServerFileResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFileResponse.h; path = GCDWebServer/Responses/GCDWebServerFileResponse.h; sourceTree = ""; }; - 09C2A8F904CF4DBCBEF9D102DBD74AFD /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = ""; }; - 09C5253CFC07A13DD0519ACE57BC0EC0 /* SynchronizedSubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedSubscribeType.swift; path = RxSwift/Concurrency/SynchronizedSubscribeType.swift; sourceTree = ""; }; - 09C5D99ED4F07DAF3A50F59C765CA416 /* String+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Rx.swift"; path = "RxSwift/Extensions/String+Rx.swift"; sourceTree = ""; }; - 09D280C7FCC6AE30E6F8430DBA380925 /* AnonymousObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObserver.swift; path = RxSwift/Observers/AnonymousObserver.swift; sourceTree = ""; }; - 0A0BEC4717A975478F52AD458ACA42AA /* OperationQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationQueueScheduler.swift; path = RxSwift/Schedulers/OperationQueueScheduler.swift; sourceTree = ""; }; - 0ABFF341309F8A2E61DCB2F092DFF2CA /* Generate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generate.swift; path = RxSwift/Observables/Generate.swift; sourceTree = ""; }; - 0C165CADEE8873C8F5D15A02BF1AF555 /* ControlTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlTarget.swift; path = RxCocoa/Common/ControlTarget.swift; sourceTree = ""; }; - 0C6BFE2E2D5A6B7A594B788F625561EF /* Skip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Skip.swift; path = RxSwift/Observables/Skip.swift; sourceTree = ""; }; - 0CD9E0BB93F28FD91CBF8872501B7280 /* MASHotKey.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASHotKey.m; path = Framework/MASHotKey.m; sourceTree = ""; }; - 0D9D5A3377EF4CDADE4D80FC29C1F20E /* ControlEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlEvent.swift; path = RxCocoa/Traits/ControlEvent.swift; sourceTree = ""; }; + 08CE7BAE0F6A7178D9136F1DBE9CE0D3 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = ""; }; + 091B320AF46DFF5E52B1CA91938163BC /* Skip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Skip.swift; path = RxSwift/Observables/Skip.swift; sourceTree = ""; }; + 09A7C38F0BA34490FE74D086703D0869 /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = RxSwift/Observables/Range.swift; sourceTree = ""; }; + 0B43F76AA34F7FD88FC35F826FE0911E /* NSObject+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx.swift"; path = "RxCocoa/Foundation/NSObject+Rx.swift"; sourceTree = ""; }; + 0B4668396025D7B53E3928CAD15C1E28 /* NSObject+Rx+RawRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx+RawRepresentable.swift"; path = "RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift"; sourceTree = ""; }; + 0BC3571EE031A7539BB287EFCD666847 /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; + 0C851BCF7777F05B23845D5F3B42477A /* SkipWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipWhile.swift; path = RxSwift/Observables/SkipWhile.swift; sourceTree = ""; }; + 0DD3EF9C6F47C3257FC0151069723CD1 /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = ""; }; 0E8A27A8C9BD6FF9AE3DCBC4050CCD76 /* Pods-ShadowsocksX-NGTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NGTests-frameworks.sh"; sourceTree = ""; }; - 0F5B2D680B55A87168B90861D051B746 /* GCDWebServerFileResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFileResponse.m; path = GCDWebServer/Responses/GCDWebServerFileResponse.m; sourceTree = ""; }; - 0FABCD0845EFCC0E95BC4EF19880A8D3 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = RxSwift/Observables/Filter.swift; sourceTree = ""; }; - 0FB611A2D6465F53874DE91ED2D760BF /* GCDWebServerFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFunctions.m; path = GCDWebServer/Core/GCDWebServerFunctions.m; sourceTree = ""; }; - 0FD7A0DC3ED806805A328B6E3183B3DD /* NSButton+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSButton+Rx.swift"; path = "RxCocoa/macOS/NSButton+Rx.swift"; sourceTree = ""; }; - 130F7474B10251411E8A0B0095FA77F1 /* RxSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = RxSwift.modulemap; sourceTree = ""; }; + 0F79F86B3A28700C995D5AC30EC550D6 /* Driver+Subscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Driver+Subscription.swift"; path = "RxCocoa/Traits/Driver/Driver+Subscription.swift"; sourceTree = ""; }; + 0FF3E0A37CDE9554E186BAE00CD9C197 /* InvocableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableType.swift; path = RxSwift/Schedulers/Internal/InvocableType.swift; sourceTree = ""; }; + 1056A640AEFE50B38D2344C0B944DC50 /* GCDWebServerFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFunctions.h; path = GCDWebServer/Core/GCDWebServerFunctions.h; sourceTree = ""; }; + 115DA97253EAAD8E69D0C8D6A825B18D /* NSSlider+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSSlider+Rx.swift"; path = "RxCocoa/macOS/NSSlider+Rx.swift"; sourceTree = ""; }; + 117E3E5CB18C4C8895AEDCB96CBFF566 /* RxTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTarget.swift; path = RxCocoa/Common/RxTarget.swift; sourceTree = ""; }; + 11C843F0A8CC61D5B0B5CCFFC9B6EE77 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; + 12173B3EF2DB80B33497504CD28D0D25 /* Debounce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debounce.swift; path = RxSwift/Observables/Debounce.swift; sourceTree = ""; }; + 121D3DED6F325810B808C962150FDF6B /* Take.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Take.swift; path = RxSwift/Observables/Take.swift; sourceTree = ""; }; + 1221D61D7EDFE6C6834C60D4AFAD701A /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = ""; }; + 124A08134F4F0DFD6C6D5F5B29F0F045 /* ResourceBundle-MASShortcut-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-MASShortcut-Info.plist"; sourceTree = ""; }; + 125D906DA6D12CC4B558691B8F324B0F /* GCDWebServerFileRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFileRequest.m; path = GCDWebServer/Requests/GCDWebServerFileRequest.m; sourceTree = ""; }; + 12628820AE714729D03F0AEE969EB3CD /* Logging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logging.swift; path = RxCocoa/Foundation/Logging.swift; sourceTree = ""; }; + 1325C66E30F87E4F665AF154722DABD6 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; 13333F29A08390FCEFECA0FDCDDC919F /* Pods-ShadowsocksX-NG-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NG-frameworks.sh"; sourceTree = ""; }; + 1384B3A09ECFD78F3EFC1FE31AF7DE8D /* InvocableScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableScheduledItem.swift; path = RxSwift/Schedulers/Internal/InvocableScheduledItem.swift; sourceTree = ""; }; 139134EE845E284F4B3ED2EF2F9A302B /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/AppKit.framework; sourceTree = DEVELOPER_DIR; }; - 13E44E93931EFF87E67F113CD862A0C1 /* Take.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Take.swift; path = RxSwift/Observables/Take.swift; sourceTree = ""; }; + 14527C0C3B63CC337E971AE1EE047A07 /* MASHotKey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASHotKey.h; path = Framework/MASHotKey.h; sourceTree = ""; }; 14A9EC2BB1EC6484018A5EB4B9B2C231 /* Pods-ShadowsocksX-NG-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ShadowsocksX-NG-umbrella.h"; sourceTree = ""; }; - 1510E6FAF4B06DADDD220C9F52E25600 /* AnonymousInvocable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousInvocable.swift; path = RxSwift/Schedulers/Internal/AnonymousInvocable.swift; sourceTree = ""; }; - 159548EDEA83A8DE85452C6B8DEB4043 /* RxSwift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxSwift.xcconfig; sourceTree = ""; }; - 15DA0C069A08192F0FEB6C4FA1B9FD43 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 15DDA519B43F0EB8DFD887D2F7A6FA8A /* SubjectType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubjectType.swift; path = RxSwift/Subjects/SubjectType.swift; sourceTree = ""; }; - 183021AC8ED6060D003674388D5B1B49 /* CombineLatest+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+Collection.swift"; path = "RxSwift/Observables/CombineLatest+Collection.swift"; sourceTree = ""; }; - 1A1567F5FA8FE7F8CB94FF8182AFE361 /* NSObject+Rx+RawRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx+RawRepresentable.swift"; path = "RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift"; sourceTree = ""; }; + 173CDFE8FFD9A8EF4825486DCB53A7A4 /* MASShortcutView+Bindings.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MASShortcutView+Bindings.h"; path = "Framework/MASShortcutView+Bindings.h"; sourceTree = ""; }; + 17B662771CEFD0C752DAF2C38021A7EB /* Timer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timer.swift; path = RxSwift/Observables/Timer.swift; sourceTree = ""; }; + 18D47804A6E897EF20B93DDAE8450B08 /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = ""; }; + 1910F3BA8275DA306C03AAF91366CA17 /* StartWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StartWith.swift; path = RxSwift/Observables/StartWith.swift; sourceTree = ""; }; 1A8CE48109F7ED7873F4FF9D2D3603AD /* Pods-proxy_conf_helper-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-proxy_conf_helper-acknowledgements.markdown"; sourceTree = ""; }; - 1C3FED0A19AFEE0E97C077B535ABB44E /* NSLayoutConstraint+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSLayoutConstraint+Rx.swift"; path = "RxCocoa/Common/NSLayoutConstraint+Rx.swift"; sourceTree = ""; }; - 1C85AD27621E054B8D7328ABDCB9697D /* BRLOptionParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BRLOptionParser.h; path = BRLOptionParser/BRLOptionParser.h; sourceTree = ""; }; - 1D373DA90C38C00B903B1FD9CD05CEC4 /* BRLOptionParser-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BRLOptionParser-dummy.m"; sourceTree = ""; }; + 1B3420B97151695E8A4E232D9A929713 /* Zip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Zip.swift; path = RxSwift/Observables/Zip.swift; sourceTree = ""; }; + 1C34DF9211C78641101C8029D821282C /* GCDWebServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServer.m; path = GCDWebServer/Core/GCDWebServer.m; sourceTree = ""; }; + 1C6FF8174AF3551817D3375622AD00A6 /* GCDWebServerRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerRequest.m; path = GCDWebServer/Core/GCDWebServerRequest.m; sourceTree = ""; }; + 1D0C71FC59A714120E705919A119EB9C /* AsMaybe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsMaybe.swift; path = RxSwift/Observables/AsMaybe.swift; sourceTree = ""; }; + 1D3126A27429E648B79C41215C88F13B /* Multicast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Multicast.swift; path = RxSwift/Observables/Multicast.swift; sourceTree = ""; }; + 1DF905835162609C61FE7431CEAEFE06 /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = RxSwift/Observables/Map.swift; sourceTree = ""; }; + 1E17FA1477E37C745A33298D5655B877 /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; + 1E7682153DC4B4654DC8897B52E1C68A /* Signal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Signal.swift; path = RxCocoa/Traits/Signal/Signal.swift; sourceTree = ""; }; + 1E8515AADD6430481FAC8F2DD92FE0F8 /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = ""; }; 1F162D37B7B6534A6D80FEE301F586EE /* Pods-ShadowsocksX-NGTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ShadowsocksX-NGTests-acknowledgements.plist"; sourceTree = ""; }; - 1F9FB942372907FC74EEC9507F4F190D /* SharedSequence+Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SharedSequence+Operators.swift"; path = "RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift"; sourceTree = ""; }; - 200EE4899584F5D5767A63F4E7E1A627 /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = de.lproj; sourceTree = ""; }; - 20192591D331E03B112CEAB1C32D1FCF /* Sequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sequence.swift; path = RxSwift/Observables/Sequence.swift; sourceTree = ""; }; - 20817295866FCA3DF75F20CA436D877A /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; - 20E5746A4CCE940BCE91535C0D37FEB2 /* ObserverType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverType.swift; path = RxSwift/ObserverType.swift; sourceTree = ""; }; - 2255320841E837341A064E1387C85F85 /* ko.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = ko.lproj; sourceTree = ""; }; - 226616D9FEC0ABA73A4365514AEE5914 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; - 22D55ADD097A4317EEBBEAC8CA5D2328 /* ControlEvent+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlEvent+Driver.swift"; path = "RxCocoa/Traits/Driver/ControlEvent+Driver.swift"; sourceTree = ""; }; - 22EE8CE9A144E74E024FCD831B543700 /* GCDWebServerRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerRequest.m; path = GCDWebServer/Core/GCDWebServerRequest.m; sourceTree = ""; }; - 23A34F10DBCE77625288E96057F56456 /* NSImageView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSImageView+Rx.swift"; path = "RxCocoa/macOS/NSImageView+Rx.swift"; sourceTree = ""; }; - 23DD34EFE94FB8C8DCE00EE72C2473BF /* TakeLast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeLast.swift; path = RxSwift/Observables/TakeLast.swift; sourceTree = ""; }; - 2487CFFD3F6BA7CF97A97003B1727B18 /* SkipUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipUntil.swift; path = RxSwift/Observables/SkipUntil.swift; sourceTree = ""; }; - 24A143E562F6586266DBD22F7295D5AD /* Delay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Delay.swift; path = RxSwift/Observables/Delay.swift; sourceTree = ""; }; + 1F7B1AB25111B41EA516AC2B26F16FB4 /* RefCountDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCountDisposable.swift; path = RxSwift/Disposables/RefCountDisposable.swift; sourceTree = ""; }; + 1F8A0E045BE3B86CD42FE28A50C51A3F /* MASShortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcut.h; path = Framework/MASShortcut.h; sourceTree = ""; }; + 1F9FFF0AB40ABBC9CD22047B6E5CC748 /* DelegateProxyType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxyType.swift; path = RxCocoa/Common/DelegateProxyType.swift; sourceTree = ""; }; + 218389799BBF34D96B7BDE06ECC09CD9 /* Disposables.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposables.swift; path = RxSwift/Disposables/Disposables.swift; sourceTree = ""; }; + 219ED455E5F4B8EBAC276EB23D845469 /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = ""; }; + 22693A1922310B1DDCE8D9B91AA49677 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = RxSwift/Observables/Filter.swift; sourceTree = ""; }; + 22ECE1CB75987611F39ADE574AA7352C /* AnyObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyObserver.swift; path = RxSwift/AnyObserver.swift; sourceTree = ""; }; + 239930698028F8A7F8F0AF8660885A40 /* SingleAsync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAsync.swift; path = RxSwift/Observables/SingleAsync.swift; sourceTree = ""; }; + 23A3D60EBC5FA9D3A2E4ACFAD6428316 /* Lock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lock.swift; path = RxSwift/Concurrency/Lock.swift; sourceTree = ""; }; 24B01D81E3D7058FA14A053EC19874D0 /* Pods-ShadowsocksX-NG-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ShadowsocksX-NG-dummy.m"; sourceTree = ""; }; - 255132D91D9485882D3509D158D686F2 /* ControlProperty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlProperty.swift; path = RxCocoa/Traits/ControlProperty.swift; sourceTree = ""; }; - 261420BDDFD507E93CA5EEE0286F0D2B /* KVORepresentable+CoreGraphics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+CoreGraphics.swift"; path = "RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift"; sourceTree = ""; }; - 268E53814A4808A9CB605BFB3FEAB50F /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = ""; }; - 2738692BF965EDDE0CDA5B4D08899095 /* GCDWebServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServer.h; path = GCDWebServer/Core/GCDWebServer.h; sourceTree = ""; }; - 288F0992DFCC5E6027AA31FD385C34D6 /* MASShortcut.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MASShortcut.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 24D58CC8AA50BE13352501DE5BA68B94 /* PrimitiveSequence+Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PrimitiveSequence+Zip+arity.swift"; path = "RxSwift/Traits/PrimitiveSequence+Zip+arity.swift"; sourceTree = ""; }; + 257A51892B0489327105FAC5C85056BB /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateSchedulerType.swift; path = RxSwift/ImmediateSchedulerType.swift; sourceTree = ""; }; + 25BD92FA972425CD9706F8177394D7DF /* GCDWebServerDataResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerDataResponse.m; path = GCDWebServer/Responses/GCDWebServerDataResponse.m; sourceTree = ""; }; + 2761A1137851210C3B778227D6BA8376 /* Observable+Bind.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Bind.swift"; path = "RxCocoa/Common/Observable+Bind.swift"; sourceTree = ""; }; + 28409654F83C1BED4A04990DF2A46117 /* HistoricalScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalScheduler.swift; path = RxSwift/Schedulers/HistoricalScheduler.swift; sourceTree = ""; }; + 2845A68913E943BC36DC30691EC2767F /* BehaviorRelay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorRelay.swift; path = RxCocoa/Traits/BehaviorRelay.swift; sourceTree = ""; }; + 284942F9AAC3AFDD49598A09EEBAF5FE /* KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KVORepresentable.swift; path = RxCocoa/Foundation/KVORepresentable.swift; sourceTree = ""; }; + 28578489FE91CF078CD23E26E04E3BBB /* GroupedObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupedObservable.swift; path = RxSwift/GroupedObservable.swift; sourceTree = ""; }; 28D7F65F9E64735E3320A028DCDDDD90 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 28EC1B5940ACD0BA9FE7309429D6ED68 /* Multicast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Multicast.swift; path = RxSwift/Observables/Multicast.swift; sourceTree = ""; }; - 292363670323CC583F50A5989CC3D9D0 /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateSchedulerType.swift; path = RxSwift/ImmediateSchedulerType.swift; sourceTree = ""; }; - 29DCD7692E660B9C1FF8E7A3063F2B47 /* InvocableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableType.swift; path = RxSwift/Schedulers/Internal/InvocableType.swift; sourceTree = ""; }; - 2A2D9F47CF554F3D0FF28A201822E872 /* Just.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Just.swift; path = RxSwift/Observables/Just.swift; sourceTree = ""; }; - 2A97F155FCEA6B4942A94BBB31544107 /* ImmediateScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateScheduler.swift; path = RxSwift/Schedulers/ImmediateScheduler.swift; sourceTree = ""; }; - 2B264AC163CEFA27D7ED08507B018B11 /* RetryWhen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryWhen.swift; path = RxSwift/Observables/RetryWhen.swift; sourceTree = ""; }; - 2BC3FA38663D9266B6B5D834492C9F7A /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; - 2CC9430D7E7FB49F1A03FD83C0F15DF0 /* Observable+Bind.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Bind.swift"; path = "RxCocoa/Common/Observable+Bind.swift"; sourceTree = ""; }; - 2D1CCFB65C786E25702F68A5601E80DC /* Merge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Merge.swift; path = RxSwift/Observables/Merge.swift; sourceTree = ""; }; - 2E60ACE8054201E83089FD336ABCAA2F /* Concat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Concat.swift; path = RxSwift/Observables/Concat.swift; sourceTree = ""; }; - 2F67068FE91E63222D2D32C4BB3BBCBD /* NSSlider+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSSlider+Rx.swift"; path = "RxCocoa/macOS/NSSlider+Rx.swift"; sourceTree = ""; }; - 2FFA998983771BA589140ED254CFBD48 /* _RX.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RX.h; path = RxCocoa/Runtime/include/_RX.h; sourceTree = ""; }; - 30A4AEAD1EF447DFE90F59D1059C79B7 /* StartWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StartWith.swift; path = RxSwift/Observables/StartWith.swift; sourceTree = ""; }; - 30FAB42EC783B04EAEDCA833EB48269E /* Driver+Subscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Driver+Subscription.swift"; path = "RxCocoa/Traits/Driver/Driver+Subscription.swift"; sourceTree = ""; }; - 31EB405D095DCBF9C17B60786F115283 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; - 321FFBA726A46A7C54E164E625D44DED /* RxCocoa-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxCocoa-dummy.m"; sourceTree = ""; }; - 326A9DBB817D95D4A5840B314BF9202B /* Never.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Never.swift; path = RxSwift/Observables/Never.swift; sourceTree = ""; }; + 294B1F176E9A1CBCB03CF68E8A428BFB /* NopDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NopDisposable.swift; path = RxSwift/Disposables/NopDisposable.swift; sourceTree = ""; }; + 2977417D444B5687C65F2845036F130C /* Sequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sequence.swift; path = RxSwift/Observables/Sequence.swift; sourceTree = ""; }; + 29D5C9E52C36A6630A4B5F4A54F3666E /* ScheduledDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledDisposable.swift; path = RxSwift/Disposables/ScheduledDisposable.swift; sourceTree = ""; }; + 2A10E8E2BEA43547BD31F4D396909B1C /* RxSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxSwift-dummy.m"; sourceTree = ""; }; + 2AB0C03C6DE868D798024FA98E343764 /* MASLocalization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASLocalization.h; path = Framework/MASLocalization.h; sourceTree = ""; }; + 2BF7CE3A988F181B6A3CCFCDAA25B69E /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = ""; }; + 2C34C0B46CA55D9826447C6EF5667B77 /* GCDWebServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServer.h; path = GCDWebServer/Core/GCDWebServer.h; sourceTree = ""; }; + 2D190E53FA2881C4C0669D0F0367DE31 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2DD2740F8043D2CE9EA5BB7A7DBFC49D /* RxCocoa.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxCocoa.xcconfig; sourceTree = ""; }; + 2FD70811FA75DA891378A68B3B6B4E2E /* ReplaySubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplaySubject.swift; path = RxSwift/Subjects/ReplaySubject.swift; sourceTree = ""; }; + 3031DA85910A1DEDA7065204F6B9BBE1 /* Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecated.swift; path = RxCocoa/Deprecated.swift; sourceTree = ""; }; + 30A75BA6552FED28E799BFDD7E6A7139 /* GCDWebServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = GCDWebServer.modulemap; sourceTree = ""; }; + 30E4F3002967D50F222222D209A56B79 /* zh-Hant.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = "zh-Hant.lproj"; sourceTree = ""; }; + 3285ED8593B0D936F2A37C7D2E0BDB0D /* RxCocoa.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = RxCocoa.modulemap; sourceTree = ""; }; 3358F45A5BEC1A7F725167CD1969EDC8 /* Pods-ShadowsocksX-NG-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ShadowsocksX-NG-acknowledgements.markdown"; sourceTree = ""; }; - 33607CFF1CB9E42C89084F9C17E407B0 /* RxSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxSwift-dummy.m"; sourceTree = ""; }; - 346BBFB5B79A5139190296845F41C8DE /* NSTextField+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSTextField+Rx.swift"; path = "RxCocoa/macOS/NSTextField+Rx.swift"; sourceTree = ""; }; - 359132E97DDCA64E851B2CE3FE71F813 /* TakeUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeUntil.swift; path = RxSwift/Observables/TakeUntil.swift; sourceTree = ""; }; - 37CB5F5627B0B6D64308CD1A83ABB3B0 /* Deferred.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deferred.swift; path = RxSwift/Observables/Deferred.swift; sourceTree = ""; }; - 38A7049C5EA5CF2C54BDD0F1BE4D6FCD /* InvocableScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableScheduledItem.swift; path = RxSwift/Schedulers/Internal/InvocableScheduledItem.swift; sourceTree = ""; }; - 3A338EA0CA1FE047514C4AE30D1EC601 /* GCDWebServerDataResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerDataResponse.h; path = GCDWebServer/Responses/GCDWebServerDataResponse.h; sourceTree = ""; }; - 3C3BD779374EECF9D6A500A90CF6279C /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = ""; }; - 3CCE02B40B95BFF261200228AF8EBC16 /* CombineLatest+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+arity.swift"; path = "RxSwift/Observables/CombineLatest+arity.swift"; sourceTree = ""; }; - 3CD46935CE54DAD2A7350CB2E4DB048C /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = ru.lproj; sourceTree = ""; }; - 3D97535E8704070D353435086265E041 /* TakeWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeWhile.swift; path = RxSwift/Observables/TakeWhile.swift; sourceTree = ""; }; - 3E29C34C13007B34D5420BE9284FDCB0 /* MASDictionaryTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASDictionaryTransformer.h; path = Framework/MASDictionaryTransformer.h; sourceTree = ""; }; - 3E4A6E1ABB2E00314CDA799343BF5983 /* Sample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sample.swift; path = RxSwift/Observables/Sample.swift; sourceTree = ""; }; - 3F3B4679D9E78EFD2FF88087203A48C6 /* RxCocoa.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxCocoa.xcconfig; sourceTree = ""; }; - 4019945AEEA809599FA5E80EB71F757D /* RxCocoa.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = RxCocoa.modulemap; sourceTree = ""; }; - 41DAD2203618169F641D264D7C2EE0E6 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = RxSwift/Observables/Error.swift; sourceTree = ""; }; - 43C50B5D873459E5F93927D1EC6F3505 /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CurrentThreadScheduler.swift; path = RxSwift/Schedulers/CurrentThreadScheduler.swift; sourceTree = ""; }; - 44D9192CE046EB20FAF1BF26C3FC60FC /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; - 44F322EFF3BACA5D7D9D859973112A90 /* GCDWebServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GCDWebServer-dummy.m"; sourceTree = ""; }; - 45E0880FB45B513CD4BFD63BB3E7B736 /* Catch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Catch.swift; path = RxSwift/Observables/Catch.swift; sourceTree = ""; }; + 33710F9F62AA2B36412EA7B08233352D /* Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debug.swift; path = RxSwift/Observables/Debug.swift; sourceTree = ""; }; + 3413B9348C850EE5AE49C8B95B12943D /* Do.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Do.swift; path = RxSwift/Observables/Do.swift; sourceTree = ""; }; + 3725898C57B3547AF4E212E583C75CE2 /* MASShortcutMonitor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutMonitor.m; path = Framework/MASShortcutMonitor.m; sourceTree = ""; }; + 37302F3E1098B88606F9963B2BFF7A3F /* Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rx.swift; path = RxSwift/Rx.swift; sourceTree = ""; }; + 399E2B8BEE8E886EE4016D87C5C85C63 /* GCDWebServerURLEncodedFormRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerURLEncodedFormRequest.h; path = GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h; sourceTree = ""; }; + 3C4B04EEA1AC1BE33D71036DEBEBF937 /* ObserverType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverType.swift; path = RxSwift/ObserverType.swift; sourceTree = ""; }; + 3CB0942D626105573A56A84ACEC555FE /* SubjectType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubjectType.swift; path = RxSwift/Subjects/SubjectType.swift; sourceTree = ""; }; + 3DD66E9E374587EE9AC648D811B5042E /* GCDWebServerErrorResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerErrorResponse.h; path = GCDWebServer/Responses/GCDWebServerErrorResponse.h; sourceTree = ""; }; + 3EB40302AC6F385C4C11271681C7BE07 /* ControlEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlEvent.swift; path = RxCocoa/Traits/ControlEvent.swift; sourceTree = ""; }; + 3F5864100C7FDE5370D2A9D47B635CA3 /* MASShortcutBinder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutBinder.h; path = Framework/MASShortcutBinder.h; sourceTree = ""; }; + 3F7E8032E1CE431DD241906525558580 /* Shortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Shortcut.h; path = Framework/Shortcut.h; sourceTree = ""; }; + 3FB4990CA1A63AF517A7F5A32C6EE3EB /* RxCocoa.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoa.h; path = RxCocoa/RxCocoa.h; sourceTree = ""; }; + 40EA3D109B9CB1C1BBDC2E9255B38366 /* Never.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Never.swift; path = RxSwift/Observables/Never.swift; sourceTree = ""; }; + 41C0048A00AC76527EB7E552AC524DAC /* SchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchedulerType.swift; path = RxSwift/SchedulerType.swift; sourceTree = ""; }; + 420BCA1748F9506534FB0A233C6EB49A /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = ""; }; + 42C5B04BED868BDFDAD6B1B4CEF885F1 /* ko.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = ko.lproj; sourceTree = ""; }; + 43D1F9A72CB74DED14E390F65E400A19 /* SynchronizedUnsubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedUnsubscribeType.swift; path = RxSwift/Concurrency/SynchronizedUnsubscribeType.swift; sourceTree = ""; }; + 440BA268964308AC9235A827B872F6D4 /* RxSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = RxSwift.modulemap; sourceTree = ""; }; + 44F80D944345E3B50B5CFF78E7C4E4D9 /* ConnectableObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservableType.swift; path = RxSwift/ConnectableObservableType.swift; sourceTree = ""; }; + 454DCFB400BFCA2DD8E4C2EC61190701 /* SerialDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDispatchQueueScheduler.swift; path = RxSwift/Schedulers/SerialDispatchQueueScheduler.swift; sourceTree = ""; }; + 4591C0BC6376C1566FEA09D9C716AB84 /* Window.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Window.swift; path = RxSwift/Observables/Window.swift; sourceTree = ""; }; + 466571AD788ED5DE02B15FD2D5AB0E3D /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = ""; }; 46662EB64876AD1C891F548C69A89E89 /* Pods-ShadowsocksX-NGTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ShadowsocksX-NGTests-dummy.m"; sourceTree = ""; }; - 48930EE93B15635DB1DC641A949AB58E /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = it.lproj; sourceTree = ""; }; - 4901C7D532E5179B742DB643CA1B408A /* ConcurrentMainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentMainScheduler.swift; path = RxSwift/Schedulers/ConcurrentMainScheduler.swift; sourceTree = ""; }; - 4A9DE35FDE449CC76ADF563645C81738 /* MainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MainScheduler.swift; path = RxSwift/Schedulers/MainScheduler.swift; sourceTree = ""; }; - 4B3925E8418FB15723527909346442D9 /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = ""; }; - 4FD63BE80EB7AD180525F89009471D6D /* Optional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Optional.swift; path = RxSwift/Observables/Optional.swift; sourceTree = ""; }; + 48320B8075CDD3A66743F2FB1C0AEE97 /* ObservableType+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableType+Extensions.swift"; path = "RxSwift/ObservableType+Extensions.swift"; sourceTree = ""; }; + 48FCACAB173ADA2C6A483176B8C97F66 /* Catch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Catch.swift; path = RxSwift/Observables/Catch.swift; sourceTree = ""; }; + 49D4DB0A334289080782A137D04524BE /* BRLOptionParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BRLOptionParser.m; path = BRLOptionParser/BRLOptionParser.m; sourceTree = ""; }; + 4B9730D65B8F0B8AE3F7A91E58EB6705 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; + 4C42E3C6553CD86CA08CB17F055E2FD1 /* NSImageView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSImageView+Rx.swift"; path = "RxCocoa/macOS/NSImageView+Rx.swift"; sourceTree = ""; }; + 4CE700501A5FBA06F359007666C43958 /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; + 4E035F93086E0E9404B6C0C525F9F238 /* GCDWebServerRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerRequest.h; path = GCDWebServer/Core/GCDWebServerRequest.h; sourceTree = ""; }; + 4EB0F48DB0F38B80DF2708AB2292F08B /* ObserveOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOn.swift; path = RxSwift/Observables/ObserveOn.swift; sourceTree = ""; }; + 4F78B857D0E9107E4AC4BE639CB5FDB5 /* MASShortcutBinder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutBinder.m; path = Framework/MASShortcutBinder.m; sourceTree = ""; }; 4FEC4B8DFE8753A9B1DE598293568F30 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; - 4FF0A1029048B0747EEF9A0E552FE307 /* KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KVORepresentable.swift; path = RxCocoa/Foundation/KVORepresentable.swift; sourceTree = ""; }; - 5089235C3188BE2DE716A15C48207E8A /* MASLocalization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASLocalization.h; path = Framework/MASLocalization.h; sourceTree = ""; }; - 51807E4919B34213B8F47CD576F3FC3C /* GroupBy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupBy.swift; path = RxSwift/Observables/GroupBy.swift; sourceTree = ""; }; - 5222FC0287904A0C1050B9B01E9712F8 /* GCDWebServerStreamedResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerStreamedResponse.h; path = GCDWebServer/Responses/GCDWebServerStreamedResponse.h; sourceTree = ""; }; - 524C8DBC63D366E5C0E8A5EA62713031 /* WithLatestFrom.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WithLatestFrom.swift; path = RxSwift/Observables/WithLatestFrom.swift; sourceTree = ""; }; - 52A9C2646B9718959021371687EE6250 /* ObserverBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverBase.swift; path = RxSwift/Observers/ObserverBase.swift; sourceTree = ""; }; - 52F0C0E792C43635C8DF0BA00874B14F /* Cancelable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cancelable.swift; path = RxSwift/Cancelable.swift; sourceTree = ""; }; + 4FEDBA21F3681BC1FBEB4E058BDEF1E4 /* GCDWebServerFileResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFileResponse.m; path = GCDWebServer/Responses/GCDWebServerFileResponse.m; sourceTree = ""; }; + 51298DE535C414C093FA9AEE5A210C4E /* ObservableType+PrimitiveSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableType+PrimitiveSequence.swift"; path = "RxSwift/Traits/ObservableType+PrimitiveSequence.swift"; sourceTree = ""; }; + 517A68D17E290C18DFC53F4AECCE8C21 /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = es.lproj; sourceTree = ""; }; + 51EC586F86D6864B74B5211875AF2253 /* BehaviorRelay+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "BehaviorRelay+Driver.swift"; path = "RxCocoa/Traits/Driver/BehaviorRelay+Driver.swift"; sourceTree = ""; }; + 52EE2194BA2C33781397BBEB8F4C9276 /* RecursiveScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveScheduler.swift; path = RxSwift/Schedulers/RecursiveScheduler.swift; sourceTree = ""; }; 52F51F94701ABD692BFFC9F92AE2E115 /* Pods-ShadowsocksX-NG-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ShadowsocksX-NG-acknowledgements.plist"; sourceTree = ""; }; - 533BCDFF477A8BB66A84035182761408 /* RxCocoa.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoa.h; path = RxCocoa/RxCocoa.h; sourceTree = ""; }; - 534E4A964C49209EE277E82628F5710B /* BooleanDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BooleanDisposable.swift; path = RxSwift/Disposables/BooleanDisposable.swift; sourceTree = ""; }; - 535DA0E1B20533E30B48C0F04AEF67CD /* MASShortcut.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcut.m; path = Framework/MASShortcut.m; sourceTree = ""; }; - 545894F30123AB01C758C6689014BCC6 /* AddRef.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AddRef.swift; path = RxSwift/Observables/AddRef.swift; sourceTree = ""; }; - 55178DF04DDB4E9CA87135167C286E60 /* MASShortcutMonitor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutMonitor.h; path = Framework/MASShortcutMonitor.h; sourceTree = ""; }; - 55279FD33E1F40398E20D7299953F40A /* MASHotKey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASHotKey.h; path = Framework/MASHotKey.h; sourceTree = ""; }; - 5548D8C229700A0AEB23E7B56630426B /* RxMutableBox.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxMutableBox.swift; path = RxSwift/RxMutableBox.swift; sourceTree = ""; }; - 55FEBC89F2833AD13021CF63D4B810E1 /* Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+arity.swift"; path = "RxSwift/Observables/Zip+arity.swift"; sourceTree = ""; }; - 5603B5E9D6CFF759B07667A13C90112C /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = fr.lproj; sourceTree = ""; }; - 5613FC3B7810194DB766F2AA387847AF /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = RxSwift/Errors.swift; sourceTree = ""; }; - 572BE12282110872C7D8E7EF29A5033C /* GCDWebServerErrorResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerErrorResponse.m; path = GCDWebServer/Responses/GCDWebServerErrorResponse.m; sourceTree = ""; }; - 57B9A9B823D866CFD5C18A2DF4FBB883 /* ShareReplayScope.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplayScope.swift; path = RxSwift/Observables/ShareReplayScope.swift; sourceTree = ""; }; - 58AB02263E99467FF2175C1702B5ED82 /* ScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItem.swift; path = RxSwift/Schedulers/Internal/ScheduledItem.swift; sourceTree = ""; }; - 58CB4D7A6C8CB1B887645BE2595AFC0E /* GCDWebServerRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerRequest.h; path = GCDWebServer/Core/GCDWebServerRequest.h; sourceTree = ""; }; - 5945D007DC7A2B629B8E5987E6184267 /* NSObject+Rx+KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx+KVORepresentable.swift"; path = "RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift"; sourceTree = ""; }; - 5AD930CE2472F57A003EF8907CA3116C /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = RxSwift/Observable.swift; sourceTree = ""; }; - 5B6B335F7D4B0FC8875810068B493F55 /* RxCocoaObjCRuntimeError+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RxCocoaObjCRuntimeError+Extensions.swift"; path = "RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift"; sourceTree = ""; }; - 5BE80522158C8CAE9E3CFE12B3D857F7 /* DisposeBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBase.swift; path = RxSwift/Disposables/DisposeBase.swift; sourceTree = ""; }; - 5CA271EB6661517D11AE48621699B565 /* ToArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToArray.swift; path = RxSwift/Observables/ToArray.swift; sourceTree = ""; }; - 5CBA0B69E87685AC3D2B60EF632158AE /* SerialDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDispatchQueueScheduler.swift; path = RxSwift/Schedulers/SerialDispatchQueueScheduler.swift; sourceTree = ""; }; - 5CCFC9D5177E577E082A70923B848393 /* SynchronizedDisposeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedDisposeType.swift; path = RxSwift/Concurrency/SynchronizedDisposeType.swift; sourceTree = ""; }; - 5CF6DC4F50F673F957821F727AF12A71 /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Extensions.swift"; path = "Platform/DispatchQueue+Extensions.swift"; sourceTree = ""; }; + 53901D4BDA021937287E33B4491AA200 /* CombineLatest+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+arity.swift"; path = "RxSwift/Observables/CombineLatest+arity.swift"; sourceTree = ""; }; + 53D3CF439796CD1B84572CBCBAAE5BA9 /* ObservableConvertibleType+Signal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableConvertibleType+Signal.swift"; path = "RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift"; sourceTree = ""; }; + 549C9311455C020E76C0D8304E77DCBB /* GCDWebServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GCDWebServer-dummy.m"; sourceTree = ""; }; + 56904622AEC39DA2CC3FFE7AC03DEEA7 /* MASDictionaryTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASDictionaryTransformer.m; path = Framework/MASDictionaryTransformer.m; sourceTree = ""; }; + 57895F669A6A45DBE1808ECFCA7E6DE8 /* MASShortcutValidator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutValidator.h; path = Framework/MASShortcutValidator.h; sourceTree = ""; }; + 59CB3865143E8097440FEC7F48AF17D7 /* ControlProperty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlProperty.swift; path = RxCocoa/Traits/ControlProperty.swift; sourceTree = ""; }; + 59F05446C5A1EF95AA5BF54D2E7130C0 /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = en.lproj; sourceTree = ""; }; + 5A1C35E455A2F2765CD140138D5A1EEF /* ScheduledItemType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItemType.swift; path = RxSwift/Schedulers/Internal/ScheduledItemType.swift; sourceTree = ""; }; + 5A5F9295B64270BDF4807BAED9FDCCF1 /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = ""; }; + 5B1C0E5A2AF56FCCFCBBA2373F04E7C8 /* String+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Rx.swift"; path = "RxSwift/Extensions/String+Rx.swift"; sourceTree = ""; }; + 5B35B3E1CD06D484F53A3E476AA3686D /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = de.lproj; sourceTree = ""; }; + 5C658B994B5D0A61D71450AAF4863AC8 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; + 5CC38924038209EE8DA70D12014386B4 /* DelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxy.swift; path = RxCocoa/Common/DelegateProxy.swift; sourceTree = ""; }; + 5CC3D4BB2BA8F24225B176DDE03F8307 /* cs.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = cs.lproj; sourceTree = ""; }; + 5D0E7B6D1939F2FFB2328BAA55AB8D33 /* SerialDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDisposable.swift; path = RxSwift/Disposables/SerialDisposable.swift; sourceTree = ""; }; + 5D4898D741BB7A3E63AD3625C5913FF4 /* First.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = First.swift; path = RxSwift/Observables/First.swift; sourceTree = ""; }; 5D84D92D27CE8A6F5C45E8A03155C1CF /* Pods-proxy_conf_helper-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-proxy_conf_helper-frameworks.sh"; sourceTree = ""; }; - 5D904A8BE8B963C1CFDCB978A106290A /* Buffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Buffer.swift; path = RxSwift/Observables/Buffer.swift; sourceTree = ""; }; - 5DB38C96718DD2622736537BB2ECC6C2 /* SchedulerServices+Emulation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SchedulerServices+Emulation.swift"; path = "RxSwift/Schedulers/SchedulerServices+Emulation.swift"; sourceTree = ""; }; - 5DEF0513A865FDE2BA2DB595F61C8538 /* GCDWebServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = GCDWebServer.modulemap; sourceTree = ""; }; - 5F5BB1CD589B3E27B8A75FA688E70401 /* BehaviorSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorSubject.swift; path = RxSwift/Subjects/BehaviorSubject.swift; sourceTree = ""; }; - 5FC9E4C5BE139DEDCF232F464EEE5F9A /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Extensions.swift"; path = "Platform/DispatchQueue+Extensions.swift"; sourceTree = ""; }; - 606D277095EEA4BF6FEB8D9270E15542 /* SharedSequence+Operators+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SharedSequence+Operators+arity.swift"; path = "RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift"; sourceTree = ""; }; - 6078A9FA6BBA43845BFA8D0BA163E903 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = ""; }; - 60A4BC59E7923D49D1F2DB66CC93CEF6 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 6180F60B96D97B62E15F102AA5722741 /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = ""; }; - 61F3F1CC2095B445C811F0C16E005B49 /* AnyObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyObserver.swift; path = RxSwift/AnyObserver.swift; sourceTree = ""; }; - 627D2F62F19998F945736C6D580E9326 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; - 628F693AA128B618F45155C70C6E1024 /* Zip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Zip.swift; path = RxSwift/Observables/Zip.swift; sourceTree = ""; }; - 636B1F25C166F05CF62D7805112E6124 /* ObservableConvertibleType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableConvertibleType.swift; path = RxSwift/ObservableConvertibleType.swift; sourceTree = ""; }; - 63D2A88D8F95FB962BFE6279B46169D6 /* ScheduledItemType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItemType.swift; path = RxSwift/Schedulers/Internal/ScheduledItemType.swift; sourceTree = ""; }; - 646E91BE14388979C352F573B4362A39 /* SkipWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipWhile.swift; path = RxSwift/Observables/SkipWhile.swift; sourceTree = ""; }; - 65BABB33CC0139D359C0ECABD05CD0B7 /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Switch.swift; path = RxSwift/Observables/Switch.swift; sourceTree = ""; }; - 66C68481E0A15400E90729E5B6E9C46D /* DisposeBag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBag.swift; path = RxSwift/Disposables/DisposeBag.swift; sourceTree = ""; }; - 6786640F8B195A8E8E18BE5034B98BDD /* pl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = pl.lproj; sourceTree = ""; }; - 68041DC65BD6DADAF82378F8875B3FCB /* SynchronizedUnsubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedUnsubscribeType.swift; path = RxSwift/Concurrency/SynchronizedUnsubscribeType.swift; sourceTree = ""; }; - 6873049F56F58D5ED3E44719FC73C4F6 /* PrimitiveSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PrimitiveSequence.swift; path = RxSwift/Traits/PrimitiveSequence.swift; sourceTree = ""; }; - 687C69F6237AA7E984907EBAB8FA2B02 /* MASShortcutView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutView.m; path = Framework/MASShortcutView.m; sourceTree = ""; }; - 68DFB337F054F8982CF31389DBFF6374 /* Do.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Do.swift; path = RxSwift/Observables/Do.swift; sourceTree = ""; }; - 68FC88BF39528F8F3D69BD6D8964B5A7 /* Shortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Shortcut.h; path = Framework/Shortcut.h; sourceTree = ""; }; - 6ADE820F11CABD3D1C1218580FD439A2 /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = ""; }; - 6B29EA946AE6D8BE387824C42B121D67 /* Materialize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Materialize.swift; path = RxSwift/Observables/Materialize.swift; sourceTree = ""; }; - 6B348F108925962F83EAEAC0E334CA06 /* SingleAsync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAsync.swift; path = RxSwift/Observables/SingleAsync.swift; sourceTree = ""; }; - 6B432AF0284AA5FB0D45EED8A72A6B1A /* GCDWebServerResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerResponse.h; path = GCDWebServer/Core/GCDWebServerResponse.h; sourceTree = ""; }; - 6BBA11BAC502FBD57943042D6D9D8975 /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = ""; }; - 6C9B2D9A28ABC58CFEE373E87A4052A7 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; - 6F9BA2F71CB99026197CB42B356FC63E /* ObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableType.swift; path = RxSwift/ObservableType.swift; sourceTree = ""; }; - 7206D6A8DAD7ADCD7E85D9D080C6BACB /* Variable+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Variable+SharedSequence.swift"; path = "RxCocoa/Traits/SharedSequence/Variable+SharedSequence.swift"; sourceTree = ""; }; - 728798194C8FC2BA7D507A14593C9C6F /* ObservableConvertibleType+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableConvertibleType+SharedSequence.swift"; path = "RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift"; sourceTree = ""; }; - 72B8CEB9D05921D08AA078AE17F53770 /* GCDWebServerResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerResponse.m; path = GCDWebServer/Core/GCDWebServerResponse.m; sourceTree = ""; }; - 72FDEB0BDDFCA5B67411693DCA3BAB36 /* _RXDelegateProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXDelegateProxy.m; path = RxCocoa/Runtime/_RXDelegateProxy.m; sourceTree = ""; }; - 752306794D721D2E1BF157AAA32771ED /* VirtualTimeScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeScheduler.swift; path = RxSwift/Schedulers/VirtualTimeScheduler.swift; sourceTree = ""; }; - 75828AB7420DC80FF4A055AD665BA0E8 /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = ""; }; - 761DD04D13CF5C96E3661EBB41496409 /* SubscribeOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscribeOn.swift; path = RxSwift/Observables/SubscribeOn.swift; sourceTree = ""; }; - 77903B50BE4AEAB8D9679B1978D574DF /* MASKeyCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASKeyCodes.h; path = Framework/MASKeyCodes.h; sourceTree = ""; }; - 78481FCBF09A8942C2BCB258298EBDBE /* BRLOptionParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BRLOptionParser.m; path = BRLOptionParser/BRLOptionParser.m; sourceTree = ""; }; - 788FB43AEDD6D9FD2ECBD95EAC8A97E5 /* UIBindingObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIBindingObserver.swift; path = RxCocoa/Traits/UIBindingObserver.swift; sourceTree = ""; }; - 7959286D1E30292AB76348C2712DE95B /* AnonymousDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousDisposable.swift; path = RxSwift/Disposables/AnonymousDisposable.swift; sourceTree = ""; }; - 7A20F2D6B7A2D475A3BEF0CAFE123400 /* KVORepresentable+Swift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+Swift.swift"; path = "RxCocoa/Foundation/KVORepresentable+Swift.swift"; sourceTree = ""; }; - 7B63AB91C9378BEF83982ADCC82E9770 /* GCDWebServer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCDWebServer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7BC64B28448C32D46B71791C7752E48F /* ResourceBundle-MASShortcut-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-MASShortcut-Info.plist"; sourceTree = ""; }; - 7C7BE50FB7791D6009BF033B78EA631C /* Lock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lock.swift; path = RxSwift/Concurrency/Lock.swift; sourceTree = ""; }; - 7CA89BE9B5B3A196D2B6855595514951 /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; - 7D03BE981ABF583B8C0A9733FC4E7758 /* GCDWebServerURLEncodedFormRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerURLEncodedFormRequest.m; path = GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m; sourceTree = ""; }; - 7D436A58ECC98D13B9A4C91CD460DF93 /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = ""; }; - 7EE2EE9316F755CDB7B2D29A98063559 /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = nl.lproj; sourceTree = ""; }; - 7F37E66B5A8F3C680354C935F2744C29 /* Repeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Repeat.swift; path = RxSwift/Observables/Repeat.swift; sourceTree = ""; }; - 8209A41698505C3145781FDD26E699EE /* ObservableConvertibleType+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableConvertibleType+Driver.swift"; path = "RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift"; sourceTree = ""; }; - 82B6A945EDCE3039C33A744E0206424D /* SectionedViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SectionedViewDataSourceType.swift; path = RxCocoa/Common/SectionedViewDataSourceType.swift; sourceTree = ""; }; - 82D5F30FE87A96D7AA09249DB4D8F82F /* SerialDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDisposable.swift; path = RxSwift/Disposables/SerialDisposable.swift; sourceTree = ""; }; + 5EA75FB12559EF9F38DE81CA6685BE6C /* ElementAt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ElementAt.swift; path = RxSwift/Observables/ElementAt.swift; sourceTree = ""; }; + 5F53F9BE0FC6F1436AD8032E8FF6D80D /* GCDWebServerStreamedResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerStreamedResponse.h; path = GCDWebServer/Responses/GCDWebServerStreamedResponse.h; sourceTree = ""; }; + 5FF30D62954A12098DAC3C27FB43EC7E /* SharedSequence+Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SharedSequence+Operators.swift"; path = "RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift"; sourceTree = ""; }; + 60D7A87958991203E6AEEF88F8165CB1 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 617D6EBFA395952801772F1383AB8AAE /* ScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItem.swift; path = RxSwift/Schedulers/Internal/ScheduledItem.swift; sourceTree = ""; }; + 62C6E1F6DE2D3160BDD5B13FBF1DD877 /* Empty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Empty.swift; path = RxSwift/Observables/Empty.swift; sourceTree = ""; }; + 63F95A3FB354F1B43BC3C7CCA7C48037 /* libBRLOptionParser.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBRLOptionParser.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 6756FEC1B269A6CF56EF4D67F08E050B /* TakeUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeUntil.swift; path = RxSwift/Observables/TakeUntil.swift; sourceTree = ""; }; + 679166C482C63EB7F940FE7A6476274B /* MASShortcut.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = MASShortcut.modulemap; sourceTree = ""; }; + 68A72BF8AF1DC1EC8C18BFA79BE3799F /* SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SharedSequence.swift; path = RxCocoa/Traits/SharedSequence/SharedSequence.swift; sourceTree = ""; }; + 68B50473C6A5B2B637DC2178073B139B /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = fr.lproj; sourceTree = ""; }; + 68F3C7D40CA579EFBF45E9BDF4844714 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = RxSwift/Observables/Error.swift; sourceTree = ""; }; + 6C82EAFB5F96FA6732152002CA4666CC /* TailRecursiveSink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TailRecursiveSink.swift; path = RxSwift/Observers/TailRecursiveSink.swift; sourceTree = ""; }; + 6CA83DA1CEDBDC939542356592B40AB3 /* SwitchIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwitchIfEmpty.swift; path = RxSwift/Observables/SwitchIfEmpty.swift; sourceTree = ""; }; + 6DA5EAC6F4067B7529AE728323D52317 /* MASLocalization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASLocalization.m; path = Framework/MASLocalization.m; sourceTree = ""; }; + 6FF66DB8174612DE3868CD61F0C25E75 /* RxCocoaRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoaRuntime.h; path = RxCocoa/Runtime/include/RxCocoaRuntime.h; sourceTree = ""; }; + 711B62B6A01799BBCBA4F90D70C6AF28 /* MASShortcut.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MASShortcut.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 729746443824EABA89E3E1088EB4F53B /* RxCocoa.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCocoa.swift; path = RxCocoa/RxCocoa.swift; sourceTree = ""; }; + 740D1DD30811098DBF267CA2EBAF0448 /* ConcurrentDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentDispatchQueueScheduler.swift; path = RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift; sourceTree = ""; }; + 7566FCCEEDFE8B433D83AD311795E367 /* RetryWhen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryWhen.swift; path = RxSwift/Observables/RetryWhen.swift; sourceTree = ""; }; + 7643BF1BAF3D845AF3B73DC3CC809225 /* GCDWebServer-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCDWebServer-prefix.pch"; sourceTree = ""; }; + 7849EB1549B76C509FCE0465C3EC6585 /* BooleanDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BooleanDisposable.swift; path = RxSwift/Disposables/BooleanDisposable.swift; sourceTree = ""; }; + 78755706F21BACDBA952EF615AE4223F /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = RxSwift/Errors.swift; sourceTree = ""; }; + 78BF2C0D1D2976671C6F01E7CF57B7D8 /* GCDWebServerFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFunctions.m; path = GCDWebServer/Core/GCDWebServerFunctions.m; sourceTree = ""; }; + 79369DACA0CF3D56E9D4D213125DD2D2 /* PublishSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishSubject.swift; path = RxSwift/Subjects/PublishSubject.swift; sourceTree = ""; }; + 7A842F5AB01E533C407EF9F939D43654 /* MASShortcutMonitor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutMonitor.h; path = Framework/MASShortcutMonitor.h; sourceTree = ""; }; + 7B940616A1513AFB926A1625599603BF /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; + 7BF437276A9A9AD2789D809F09705992 /* ConcurrentMainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentMainScheduler.swift; path = RxSwift/Schedulers/ConcurrentMainScheduler.swift; sourceTree = ""; }; + 7C4E2B96284BE7E91A2FAC7A35722534 /* DeprecationWarner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DeprecationWarner.swift; path = Platform/DeprecationWarner.swift; sourceTree = ""; }; + 7FF0F128359723A54E21FEBB2D99C657 /* Amb.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amb.swift; path = RxSwift/Observables/Amb.swift; sourceTree = ""; }; + 8090A9366A6F313575595425BA5B7C5F /* MASShortcutView+Bindings.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MASShortcutView+Bindings.m"; path = "Framework/MASShortcutView+Bindings.m"; sourceTree = ""; }; + 812492787E3005F375F66430EEFEB2D3 /* CombineLatest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombineLatest.swift; path = RxSwift/Observables/CombineLatest.swift; sourceTree = ""; }; + 814650269499C22D7A00826E5401B231 /* MASKeyCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASKeyCodes.h; path = Framework/MASKeyCodes.h; sourceTree = ""; }; + 81BA4BA48C5140576A6D93FB9EF7C2C1 /* ControlEvent+Signal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlEvent+Signal.swift"; path = "RxCocoa/Traits/Signal/ControlEvent+Signal.swift"; sourceTree = ""; }; + 822A32C67318B2171827F9F276472026 /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = ""; }; + 8289A948846D9CADF1D390856F40AF89 /* DistinctUntilChanged.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DistinctUntilChanged.swift; path = RxSwift/Observables/DistinctUntilChanged.swift; sourceTree = ""; }; + 82AB01A10760A9DBC7F68ACDB184CB9F /* GCDWebServerMultiPartFormRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerMultiPartFormRequest.h; path = GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h; sourceTree = ""; }; + 82B40C2141EAEBD3F4738B4EF37F735E /* Binder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Binder.swift; path = RxCocoa/Common/Binder.swift; sourceTree = ""; }; + 82C92E152F7133108027B5F35A4EA2F6 /* Sample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sample.swift; path = RxSwift/Observables/Sample.swift; sourceTree = ""; }; + 83268468D9194D59FF72E067422BC173 /* NSView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSView+Rx.swift"; path = "RxCocoa/macOS/NSView+Rx.swift"; sourceTree = ""; }; 83323A1A2936BBA3D386DCC078E3821E /* Pods-ShadowsocksX-NGTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ShadowsocksX-NGTests-acknowledgements.markdown"; sourceTree = ""; }; - 8395CF3A1AD4518051CE6450BDBC43BD /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = ""; }; - 863E188823EC0A70B5265256ECE53AA4 /* DelegateProxyType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxyType.swift; path = RxCocoa/Common/DelegateProxyType.swift; sourceTree = ""; }; - 8700E99248E4432CC4DC446DE4A91E41 /* zh-Hans.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = "zh-Hans.lproj"; sourceTree = ""; }; - 87565A23AA7557C2E511616C236D8EA9 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Alamofire.modulemap; sourceTree = ""; }; - 878BBACC17D3136FA4DD1CD04CAD85A0 /* Completable+AndThen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Completable+AndThen.swift"; path = "RxSwift/Traits/Completable+AndThen.swift"; sourceTree = ""; }; - 88003809F8CD8A52B418884D95EB7FFD /* GCDWebServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCDWebServer-umbrella.h"; sourceTree = ""; }; - 881AB2BAED9DBD8D39A04DCCFD4A871B /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = ""; }; - 8A0AC98004CCEB4CC8A5BECA09878CAA /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; - 8C49546F441EF6B013C11F9ECC4E494E /* MASDictionaryTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASDictionaryTransformer.m; path = Framework/MASDictionaryTransformer.m; sourceTree = ""; }; - 8C848585CA8A7F199434CE368A9DB06C /* ConcurrentDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentDispatchQueueScheduler.swift; path = RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift; sourceTree = ""; }; + 83A9CCC244BECF2D84BC459532DA1B78 /* GCDWebServerMultiPartFormRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerMultiPartFormRequest.m; path = GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m; sourceTree = ""; }; + 87372668A1EA52537C962C8365145B96 /* Dematerialize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Dematerialize.swift; path = RxSwift/Observables/Dematerialize.swift; sourceTree = ""; }; + 874D86BD8C4CCD8EC1708994A7C75D5A /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; + 877FB023C6C79A9CB7DD34AAFEEB6434 /* NSTextField+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSTextField+Rx.swift"; path = "RxCocoa/macOS/NSTextField+Rx.swift"; sourceTree = ""; }; + 88223CC64D20FAA41D33B56DA90F1829 /* GCDWebServerHTTPStatusCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerHTTPStatusCodes.h; path = GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h; sourceTree = ""; }; + 88AACF5B7E188D3448847253899BFC8F /* Delay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Delay.swift; path = RxSwift/Observables/Delay.swift; sourceTree = ""; }; + 88AC45588E239E491BA98259039A6802 /* Sink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sink.swift; path = RxSwift/Observables/Sink.swift; sourceTree = ""; }; + 8B234AB54ABD1C374D34665C3DCD649E /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Extensions.swift"; path = "Platform/DispatchQueue+Extensions.swift"; sourceTree = ""; }; + 8B8C0CBA55B2D8C521EC4555A764C4A3 /* DisposeBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBase.swift; path = RxSwift/Disposables/DisposeBase.swift; sourceTree = ""; }; + 8BE1FB4F6E66271CE86F1B9F3B10C4B2 /* MASHotKey.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASHotKey.m; path = Framework/MASHotKey.m; sourceTree = ""; }; 8CDD45C6D7A038F415A78787317E931A /* Pods-proxy_conf_helper-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-proxy_conf_helper-resources.sh"; sourceTree = ""; }; - 901EFAF9E76AF0F9D3DBC7CE6212D4B8 /* NSObject+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx.swift"; path = "RxCocoa/Foundation/NSObject+Rx.swift"; sourceTree = ""; }; - 92244CECCE7B444FAB2C8202E5EA4056 /* Disposables.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposables.swift; path = RxSwift/Disposables/Disposables.swift; sourceTree = ""; }; - 924ECD8580145EBC5702BD6D3B314F61 /* Variable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Variable.swift; path = RxSwift/Subjects/Variable.swift; sourceTree = ""; }; - 9352AFD1D6C6B57A9AF36DD5277BB196 /* NSView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSView+Rx.swift"; path = "RxCocoa/macOS/NSView+Rx.swift"; sourceTree = ""; }; + 8CE15615F891AE84CC28B31DD1DFED34 /* _RX.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RX.h; path = RxCocoa/Runtime/include/_RX.h; sourceTree = ""; }; + 8CF4A5D83CF4FF7422C8E7F007410BA4 /* MainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MainScheduler.swift; path = RxSwift/Schedulers/MainScheduler.swift; sourceTree = ""; }; + 8DDB54ED8FEE2C1E06EFC2F722F8735C /* ShareReplayScope.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplayScope.swift; path = RxSwift/Observables/ShareReplayScope.swift; sourceTree = ""; }; + 8DF79E5957660D27729BE2711F7510D5 /* GCDWebServerDataRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerDataRequest.m; path = GCDWebServer/Requests/GCDWebServerDataRequest.m; sourceTree = ""; }; + 8EC9ECCC54FEA683BBDB8B5CD94124B1 /* Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecated.swift; path = RxSwift/Deprecated.swift; sourceTree = ""; }; + 8F5083A9395E7BC273257A316BA5D517 /* Completable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Completable.swift; path = RxSwift/Traits/Completable.swift; sourceTree = ""; }; + 8F59435F621E888DE7C2D34F05907491 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; + 91CE07E2C296F1B3388DC2668BAB1341 /* Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+arity.swift"; path = "RxSwift/Observables/Zip+arity.swift"; sourceTree = ""; }; + 91E0555770D3BEC1183279EBBF63B6EB /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Switch.swift; path = RxSwift/Observables/Switch.swift; sourceTree = ""; }; + 920735A244F39A83F52DF97FA4E7427B /* Generate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generate.swift; path = RxSwift/Observables/Generate.swift; sourceTree = ""; }; + 9308FACB56EF2744A5DF058B75203AE6 /* Single.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Single.swift; path = RxSwift/Traits/Single.swift; sourceTree = ""; }; + 938FC605EEA4041CA074FE17C4D53535 /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CurrentThreadScheduler.swift; path = RxSwift/Schedulers/CurrentThreadScheduler.swift; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9480F95CFFC2D8DA4D91AE587BFF20B8 /* TextInput.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextInput.swift; path = RxCocoa/Common/TextInput.swift; sourceTree = ""; }; - 9487D19A313750E8B3F0DDB32B87E864 /* RxCocoa.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCocoa.swift; path = RxCocoa/RxCocoa.swift; sourceTree = ""; }; + 94342D18D6FF2890EDEEBE3520A6E66E /* Repeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Repeat.swift; path = RxSwift/Observables/Repeat.swift; sourceTree = ""; }; + 9445256D5E0C36ADD934F62A67B04A09 /* CompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CompositeDisposable.swift; path = RxSwift/Disposables/CompositeDisposable.swift; sourceTree = ""; }; + 94BAE73C588EBC604DCE573EBE4A04AB /* _RX.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RX.m; path = RxCocoa/Runtime/_RX.m; sourceTree = ""; }; + 94D1A921D2DDCB6ADE167A6D9F9FC69D /* MASShortcut.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcut.m; path = Framework/MASShortcut.m; sourceTree = ""; }; + 9589591754500401F219D9EC60BB6AD7 /* AddRef.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AddRef.swift; path = RxSwift/Observables/AddRef.swift; sourceTree = ""; }; + 95CD99AE9A1C290252A419DD48B2A263 /* _RXDelegateProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXDelegateProxy.m; path = RxCocoa/Runtime/_RXDelegateProxy.m; sourceTree = ""; }; + 970A1485E6688625754970DC8BBC7072 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; 98522BF2EB25C0255284080F9CA3E195 /* Pods-ShadowsocksX-NG.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NG.debug.xcconfig"; sourceTree = ""; }; - 986B511A99FF2CD40FF4907FE5DBAD8F /* _RXObjCRuntime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXObjCRuntime.m; path = RxCocoa/Runtime/_RXObjCRuntime.m; sourceTree = ""; }; - 98882780F0AB1693529D79FBB62760CE /* MASShortcutBinder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutBinder.m; path = Framework/MASShortcutBinder.m; sourceTree = ""; }; - 996FFF36FA1A968D9BC5367C870F15F0 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; - 99EEC612B008B452C8ACD615123EDA93 /* RxCocoa-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxCocoa-umbrella.h"; sourceTree = ""; }; - 9B1F2B769E9F6355DF3AC956AF04D064 /* AsSingle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsSingle.swift; path = RxSwift/Observables/AsSingle.swift; sourceTree = ""; }; - 9B31A4E3C1E226E2FB724AB96C882B5A /* _RXKVOObserver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXKVOObserver.h; path = RxCocoa/Runtime/include/_RXKVOObserver.h; sourceTree = ""; }; - 9B539B1FEB1247454F06F69690A74881 /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = ""; }; - 9B6ACACC69C2EA2681770741535F1D69 /* MASShortcut.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MASShortcut.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9B7FB3B8F0F547E0CCC3EDB3FA5509E5 /* TailRecursiveSink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TailRecursiveSink.swift; path = RxSwift/Observers/TailRecursiveSink.swift; sourceTree = ""; }; + 987AC2089C4B4C35C212D30E0C0E7B9A /* GCDWebServerStreamedResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerStreamedResponse.m; path = GCDWebServer/Responses/GCDWebServerStreamedResponse.m; sourceTree = ""; }; + 98923078307F200863DB7C59FCFC7002 /* SynchronizedDisposeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedDisposeType.swift; path = RxSwift/Concurrency/SynchronizedDisposeType.swift; sourceTree = ""; }; + 9A04D2678FFF63F78747A96526C32525 /* PublishRelay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishRelay.swift; path = RxCocoa/Traits/PublishRelay.swift; sourceTree = ""; }; + 9A0D3BBA7497A389734E9EEFBAE2464D /* TakeLast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeLast.swift; path = RxSwift/Observables/TakeLast.swift; sourceTree = ""; }; + 9B62CFED1E64A9E67642177FF31ADAB0 /* AsyncSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncSubject.swift; path = RxSwift/Subjects/AsyncSubject.swift; sourceTree = ""; }; 9B8B5CBA357BDB968C73E8F58DFBC74C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9BA0976D52E0B1BE7C75718D8F34D6D7 /* MASKeyMasks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASKeyMasks.h; path = Framework/MASKeyMasks.h; sourceTree = ""; }; 9BA2A0099476E08B6CC8026BDF0C603E /* Pods-ShadowsocksX-NGTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NGTests.debug.xcconfig"; sourceTree = ""; }; - 9BC03B0B3ABA0DCA68E6E5743698D228 /* Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecated.swift; path = RxSwift/Deprecated.swift; sourceTree = ""; }; - 9E95ABF737E8C0AF728AE99576593651 /* ScheduledDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledDisposable.swift; path = RxSwift/Disposables/ScheduledDisposable.swift; sourceTree = ""; }; - 9FAE9397A18DDA64A11847EF6BA0476C /* MASShortcutValidator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutValidator.m; path = Framework/MASShortcutValidator.m; sourceTree = ""; }; - A023097C535D0BD3D56EA8BD993D7B3F /* Dematerialize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Dematerialize.swift; path = RxSwift/Observables/Dematerialize.swift; sourceTree = ""; }; - A040CC73BFCA8B9320CEF555F949D711 /* Variable+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Variable+Driver.swift"; path = "RxCocoa/Traits/Driver/Variable+Driver.swift"; sourceTree = ""; }; - A077B4E84F0E05629C70075B9B9D871E /* MASShortcutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutView.h; path = Framework/MASShortcutView.h; sourceTree = ""; }; - A0A5B4E433F12A0EE14939299BFA30B5 /* MASShortcutMonitor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutMonitor.m; path = Framework/MASShortcutMonitor.m; sourceTree = ""; }; - A0A7422506FBD6F1F77B1F2A6D4167C1 /* GCDWebServer-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCDWebServer-prefix.pch"; sourceTree = ""; }; - A102F9379F5A55F3D3C85A1FB3687F97 /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = RxSwift/Observables/Map.swift; sourceTree = ""; }; - A25F673AD7CCCE0189ADEB549EB5F618 /* SynchronizedOnType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedOnType.swift; path = RxSwift/Concurrency/SynchronizedOnType.swift; sourceTree = ""; }; - A30C48C8ED1D9EC8231B3D871BC285C7 /* GCDWebServerConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerConnection.m; path = GCDWebServer/Core/GCDWebServerConnection.m; sourceTree = ""; }; - A4DAA5324C3F0718C4CC7852CBAC50D0 /* RefCountDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCountDisposable.swift; path = RxSwift/Disposables/RefCountDisposable.swift; sourceTree = ""; }; + 9BCF18187EC77D481751E793B1B99458 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; + 9C124E5083A1C670ECBA0CC803184E03 /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = ru.lproj; sourceTree = ""; }; + 9C77EDD882C5528391392F6395AEA3CC /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9D1F46FBDCCCDDD5DD811F74DF066657 /* BRLOptionParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BRLOptionParser.h; path = BRLOptionParser/BRLOptionParser.h; sourceTree = ""; }; + 9D3C210247CB8CE3DF722B8D487265EB /* Signal+Subscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Signal+Subscription.swift"; path = "RxCocoa/Traits/Signal/Signal+Subscription.swift"; sourceTree = ""; }; + 9D966DC3E49AE0BCCC9A1CA03C275F22 /* Pods_ShadowsocksX_NGTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NGTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9E5ED856E0033C185BB3A1CFF513A42C /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = ""; }; + 9FD412C15BC617CC38E190F17BB06655 /* WithLatestFrom.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WithLatestFrom.swift; path = RxSwift/Observables/WithLatestFrom.swift; sourceTree = ""; }; + A0A874527BA87240185BA903D136C3AF /* Merge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Merge.swift; path = RxSwift/Observables/Merge.swift; sourceTree = ""; }; + A0BF6605792D11FF8BA02337532C154B /* MASShortcutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutView.h; path = Framework/MASShortcutView.h; sourceTree = ""; }; + A0F9D84DF77D8398558F3D4F5FD606DB /* DelaySubscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelaySubscription.swift; path = RxSwift/Observables/DelaySubscription.swift; sourceTree = ""; }; + A35868FCBD5266D702CEA4A6E65DF160 /* _RXKVOObserver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXKVOObserver.h; path = RxCocoa/Runtime/include/_RXKVOObserver.h; sourceTree = ""; }; A5055B8EFFFBEDE50909E935D4BCA446 /* Pods-proxy_conf_helper.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-proxy_conf_helper.release.xcconfig"; sourceTree = ""; }; - A6573695D6E38AB0E45298916E5927F9 /* NopDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NopDisposable.swift; path = RxSwift/Disposables/NopDisposable.swift; sourceTree = ""; }; - A7DC3D31C58327F3981DA70B91FF9D28 /* MASShortcut.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MASShortcut.xcconfig; sourceTree = ""; }; - A829DA85B827FD4953161E2FC29C0AB4 /* GroupedObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupedObservable.swift; path = RxSwift/GroupedObservable.swift; sourceTree = ""; }; - A923BB8E574DFADCE6DFF91F708E5886 /* ObservableType+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableType+Extensions.swift"; path = "RxSwift/ObservableType+Extensions.swift"; sourceTree = ""; }; - A9826B12E4E987A2B073DA6D32BBA53C /* GCDWebServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServer.m; path = GCDWebServer/Core/GCDWebServer.m; sourceTree = ""; }; - A984B4B81E65B86157898F60533E1E07 /* GCDWebServer.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GCDWebServer.xcconfig; sourceTree = ""; }; - AC8837A9B05156CBBE4A8FECC465034F /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; - AD0CD5DD6E42873872D2B73A60081FD0 /* Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debug.swift; path = RxSwift/Observables/Debug.swift; sourceTree = ""; }; - ADD97D49C025DAFE6EE85E866D134966 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; + A604573634B3B440BAC80E6185340643 /* ToArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToArray.swift; path = RxSwift/Observables/ToArray.swift; sourceTree = ""; }; + A6162331FD69499451313416F088EB1C /* SectionedViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SectionedViewDataSourceType.swift; path = RxCocoa/Common/SectionedViewDataSourceType.swift; sourceTree = ""; }; + A6FA4BF27FB90B714947E536885E37C1 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A96B9F66608C047F1379AAE238F18C2A /* Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reduce.swift; path = RxSwift/Observables/Reduce.swift; sourceTree = ""; }; + AACEB0B4DCFE72B1C86FBDD44F903602 /* GCDWebServer.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GCDWebServer.xcconfig; sourceTree = ""; }; + AB8E26A34CAE0B693F1F2C52465402C3 /* AnonymousDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousDisposable.swift; path = RxSwift/Disposables/AnonymousDisposable.swift; sourceTree = ""; }; + ABCEC9093299246040636BFC7D014387 /* SwiftSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSupport.swift; path = RxSwift/SwiftSupport/SwiftSupport.swift; sourceTree = ""; }; + ABE0B812B00B54AA2F6982337A7172A2 /* Create.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Create.swift; path = RxSwift/Observables/Create.swift; sourceTree = ""; }; + ABEF7628490A51F0ED3BE67393DEB56E /* MASShortcut-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut-umbrella.h"; sourceTree = ""; }; + AD54960D651138A3CA4F03327ED04C1E /* URLSession+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URLSession+Rx.swift"; path = "RxCocoa/Foundation/URLSession+Rx.swift"; sourceTree = ""; }; + ADBBB7FC840E52C76645ADFD06C6F489 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; AE6E689502E4366B125481CD898B947E /* Pods-proxy_conf_helper-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-proxy_conf_helper-acknowledgements.plist"; sourceTree = ""; }; - AE7C79F11D25CEDB1D05648901AFF01D /* NSControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSControl+Rx.swift"; path = "RxCocoa/macOS/NSControl+Rx.swift"; sourceTree = ""; }; - AEF8F1346C831D7B8A9AB960E3B768C0 /* SchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchedulerType.swift; path = RxSwift/SchedulerType.swift; sourceTree = ""; }; - AF7187DD22E17C86AB22B3969936E90C /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = ""; }; - B0EC4DF0E84A696168D1071B48A4F7F4 /* AsyncLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncLock.swift; path = RxSwift/Concurrency/AsyncLock.swift; sourceTree = ""; }; - B0FC490145F0D2AD9B833C41F78CA818 /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B11F51D93DCFD7B0948095E201A09C71 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B16B0EBC2B5BA4309D9844CDE1932B26 /* Throttle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Throttle.swift; path = RxSwift/Observables/Throttle.swift; sourceTree = ""; }; - B1AA3C8E05F2C2D813D16D20D9984553 /* Using.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Using.swift; path = RxSwift/Observables/Using.swift; sourceTree = ""; }; - B2093E2378DE5EC41D64F8387561BF3B /* MASKeyMasks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASKeyMasks.h; path = Framework/MASKeyMasks.h; sourceTree = ""; }; - B23C70F218FD3D53D1E083383A8C8225 /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = RxSwift/Observables/Range.swift; sourceTree = ""; }; - B2EA7252711AF3E4D70DD2035DA71438 /* SingleAssignmentDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAssignmentDisposable.swift; path = RxSwift/Disposables/SingleAssignmentDisposable.swift; sourceTree = ""; }; + AE6FE24DA6B6C599439A0CD35E6C0C39 /* _RXObjCRuntime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXObjCRuntime.m; path = RxCocoa/Runtime/_RXObjCRuntime.m; sourceTree = ""; }; + AECA5396C8BF81522F020F67B5051752 /* GCDWebServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GCDWebServer-umbrella.h"; sourceTree = ""; }; + AECFBD9B4972BED36C6D3ACC0177E0E5 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = RxSwift/Observable.swift; sourceTree = ""; }; + AF97805B59E93B8CDD1F35ADC2C1160C /* Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeout.swift; path = RxSwift/Observables/Timeout.swift; sourceTree = ""; }; + B0472FBF9DAB466EF0A53394A8D2AA12 /* RxSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-prefix.pch"; sourceTree = ""; }; + B140252F1C653182982BDDFA6F4DFFEF /* TextInput.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextInput.swift; path = RxCocoa/Common/TextInput.swift; sourceTree = ""; }; + B1FE5441218FAE87F6E57A87233B4A0F /* Completable+AndThen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Completable+AndThen.swift"; path = "RxSwift/Traits/Completable+AndThen.swift"; sourceTree = ""; }; + B1FECC6066F8385524F9B523590A82C8 /* DisposeBag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBag.swift; path = RxSwift/Disposables/DisposeBag.swift; sourceTree = ""; }; + B2929F5EBA6B563EE116F09A01CE8D7B /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = nl.lproj; sourceTree = ""; }; + B2F7E00EE5AC554A4695B58D3E0EEC68 /* LockOwnerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LockOwnerType.swift; path = RxSwift/Concurrency/LockOwnerType.swift; sourceTree = ""; }; B30805F63C611810B322187824EBC4A5 /* Pods-ShadowsocksX-NGTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NGTests-resources.sh"; sourceTree = ""; }; - B362693E8CB87D85D869ECEC9A308631 /* BRLOptionParser-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BRLOptionParser-prefix.pch"; sourceTree = ""; }; - B3F32502ED756288E4F37152D996A3FA /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B4C0501500E132C7E97A97A425E68D90 /* SwitchIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwitchIfEmpty.swift; path = RxSwift/Observables/SwitchIfEmpty.swift; sourceTree = ""; }; - B4D3408600A2042F4070CA97A67C60D5 /* PublishSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishSubject.swift; path = RxSwift/Subjects/PublishSubject.swift; sourceTree = ""; }; - B57622ECC64CA3D7C8ADDDEA14B176F5 /* PrimitiveSequence+Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PrimitiveSequence+Zip+arity.swift"; path = "RxSwift/Traits/PrimitiveSequence+Zip+arity.swift"; sourceTree = ""; }; - B677B77B72CD0E70D2DC5499A6D18B31 /* GCDWebServerStreamedResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerStreamedResponse.m; path = GCDWebServer/Responses/GCDWebServerStreamedResponse.m; sourceTree = ""; }; - B6FC4FABF722AF2F518BE654AD7DCE4D /* AsyncSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncSubject.swift; path = RxSwift/Subjects/AsyncSubject.swift; sourceTree = ""; }; - B72677785827D5383DD7933263E069B1 /* RxCocoa-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxCocoa-prefix.pch"; sourceTree = ""; }; + B3193AEA5372872BA57804AA2CAE1875 /* GCDWebServer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCDWebServer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B3A10808A0957AA2EC5EB7D1A77E4B27 /* NSLayoutConstraint+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSLayoutConstraint+Rx.swift"; path = "RxCocoa/Common/NSLayoutConstraint+Rx.swift"; sourceTree = ""; }; + B458372D1D2009A7FDC10C7A5379CF07 /* GCDWebServerConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerConnection.m; path = GCDWebServer/Core/GCDWebServerConnection.m; sourceTree = ""; }; + B4CB86E9D779A444876EA5C4C68A3FBD /* BRLOptionParser-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BRLOptionParser-dummy.m"; sourceTree = ""; }; + B4D23B3353252A87A2DFCBE6BCAC355C /* DeprecationWarner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DeprecationWarner.swift; path = Platform/DeprecationWarner.swift; sourceTree = ""; }; + B4E3D27538532E6FBE6335CF89442070 /* ControlEvent+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlEvent+Driver.swift"; path = "RxCocoa/Traits/Driver/ControlEvent+Driver.swift"; sourceTree = ""; }; + B55BFBC972E986BB01725A95A9860DA2 /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = ""; }; + B5BC8CC3D75BE1CAA9F4B2902AAF6A7F /* PublishRelay+Signal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "PublishRelay+Signal.swift"; path = "RxCocoa/Traits/Signal/PublishRelay+Signal.swift"; sourceTree = ""; }; + B61C725932BE55BD3F51C1611F4C00E1 /* HistoricalSchedulerTimeConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalSchedulerTimeConverter.swift; path = RxSwift/Schedulers/HistoricalSchedulerTimeConverter.swift; sourceTree = ""; }; + B790A80F95F23886D51E59CA3075E0B7 /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Extensions.swift"; path = "Platform/DispatchQueue+Extensions.swift"; sourceTree = ""; }; B792280B7BC7CA44B5D7090C8F732A0D /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B8342F1DDDA13DCD8CF77080A6A16BCC /* ja.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = ja.lproj; sourceTree = ""; }; - BBB5913EEAFF6831515284D85F9B42AB /* RxSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-prefix.pch"; sourceTree = ""; }; - BC25AF2EB8052CF4B0A98541C78FA86C /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = ""; }; - BC5A23A63EA04BBF65EBBC3D5905D453 /* MASShortcut-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut-dummy.m"; sourceTree = ""; }; - BDE1BDB4BDD14E3E8B8C3F8ED3B3C53A /* Reactive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reactive.swift; path = RxSwift/Reactive.swift; sourceTree = ""; }; + B7C8CD3DFA056CB378EA8126D471FE4D /* GCDWebServerConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerConnection.h; path = GCDWebServer/Core/GCDWebServerConnection.h; sourceTree = ""; }; + B8FB3328120B8DA4A4A0E2CA1B29F188 /* RxCocoa-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxCocoa-umbrella.h"; sourceTree = ""; }; + B96C6614EE1F3536C3C06892684F2657 /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = RxSwift/Disposable.swift; sourceTree = ""; }; + B98A2E7455847993E52C3245DF62ACCE /* CombineLatest+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+Collection.swift"; path = "RxSwift/Observables/CombineLatest+Collection.swift"; sourceTree = ""; }; + B9FD186DCB0C2486656EE428FDF24E95 /* MASShortcutValidator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutValidator.m; path = Framework/MASShortcutValidator.m; sourceTree = ""; }; + BA2390463C1EED454182AA10546F90EE /* KVORepresentable+CoreGraphics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+CoreGraphics.swift"; path = "RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift"; sourceTree = ""; }; + BD319BD2D6840013A6DB5A5E61C57FD6 /* _RXDelegateProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXDelegateProxy.h; path = RxCocoa/Runtime/include/_RXDelegateProxy.h; sourceTree = ""; }; + BDAA1AF05A1F0B1B7C16588267607FE1 /* GCDWebServerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerPrivate.h; path = GCDWebServer/Core/GCDWebServerPrivate.h; sourceTree = ""; }; + BDE9D3194329F41EB9A694107DB540EE /* RxSwift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxSwift.xcconfig; sourceTree = ""; }; BE672B43951C625CA5F89E448A620AB0 /* Pods-ShadowsocksX-NGTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-ShadowsocksX-NGTests.modulemap"; sourceTree = ""; }; - BF541EB164C2E45EC80ADBE338F2D325 /* Pods_ShadowsocksX_NG.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NG.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C0D57732901E7827AB4442A3185E7287 /* DistinctUntilChanged.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DistinctUntilChanged.swift; path = RxSwift/Observables/DistinctUntilChanged.swift; sourceTree = ""; }; - C163E270D8C0282204B45FA92F52546F /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; - C1F68587D16CABA9C7433492E59AB224 /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = ""; }; - C45B38DD11A907BC6F5B45FBB0A35B0C /* DispatchQueueConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DispatchQueueConfiguration.swift; path = RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift; sourceTree = ""; }; - C6E4C64CF7155899BC2A74A24FB7513F /* Producer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Producer.swift; path = RxSwift/Observables/Producer.swift; sourceTree = ""; }; - C760BAF596F45988BF95E5D3C10BA670 /* libBRLOptionParser.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBRLOptionParser.a; sourceTree = BUILT_PRODUCTS_DIR; }; - C8C4EEF5D5723B94ADD7BCE012A2C6E7 /* VirtualTimeConverterType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeConverterType.swift; path = RxSwift/Schedulers/VirtualTimeConverterType.swift; sourceTree = ""; }; - C8E1C61760F4B2BFEC652B9A01D4F846 /* MASShortcutView+Bindings.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MASShortcutView+Bindings.m"; path = "Framework/MASShortcutView+Bindings.m"; sourceTree = ""; }; - C952CFCB4CF5FD55CFE8949FD41C9460 /* GCDWebServerFileRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFileRequest.h; path = GCDWebServer/Requests/GCDWebServerFileRequest.h; sourceTree = ""; }; - C9DE8782EF7863C69F019CB969C665C2 /* Create.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Create.swift; path = RxSwift/Observables/Create.swift; sourceTree = ""; }; - CAFB8EBD43A17F895E88B967D4BA489A /* ElementAt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ElementAt.swift; path = RxSwift/Observables/ElementAt.swift; sourceTree = ""; }; - CB2D9630B47A5E202FF1CFB831ACACDE /* DefaultIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultIfEmpty.swift; path = RxSwift/Observables/DefaultIfEmpty.swift; sourceTree = ""; }; - CD3F084299BD99D03F6B8FC8783B3AE8 /* GCDWebServerMultiPartFormRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerMultiPartFormRequest.m; path = GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m; sourceTree = ""; }; - CD4154ED163C40AFD6A2FCB49EE532DC /* Event.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Event.swift; path = RxSwift/Event.swift; sourceTree = ""; }; - CE411A2DEA5A7FCC657E6AE76503E34C /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = ""; }; + BEA567412780FF078C4F7D7AEEA21AD2 /* GCDWebServerFileRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFileRequest.h; path = GCDWebServer/Requests/GCDWebServerFileRequest.h; sourceTree = ""; }; + BF25BEA59068FC2091F298B09B53F9A0 /* ja.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = ja.lproj; sourceTree = ""; }; + C045555E3D465D287E7928F6180E1B12 /* MASShortcut-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut-prefix.pch"; sourceTree = ""; }; + C12D136B18E0E7F8F564601A28FFF96F /* ObservableConvertibleType+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableConvertibleType+Driver.swift"; path = "RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift"; sourceTree = ""; }; + C143DF478B2ECD2870DC326426CCA893 /* BinaryDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BinaryDisposable.swift; path = RxSwift/Disposables/BinaryDisposable.swift; sourceTree = ""; }; + C15620E5544258EF1AEC163EC547C2E3 /* ObserverBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverBase.swift; path = RxSwift/Observers/ObserverBase.swift; sourceTree = ""; }; + C2A1585CB16C85AE91BDB4B9405928A2 /* SkipUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipUntil.swift; path = RxSwift/Observables/SkipUntil.swift; sourceTree = ""; }; + C38541370FCAF5848E3402B758806B42 /* OperationQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationQueueScheduler.swift; path = RxSwift/Schedulers/OperationQueueScheduler.swift; sourceTree = ""; }; + C54EAA06C0712228D110E5F33FD72EC9 /* MASShortcut-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MASShortcut-dummy.m"; sourceTree = ""; }; + C558DBA8867D3525206597226AB7FEAC /* Zip+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+Collection.swift"; path = "RxSwift/Observables/Zip+Collection.swift"; sourceTree = ""; }; + C57692BA24E650520C1D877523C0A5F0 /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = ""; }; + C65BFED56C12E4DDC34449B0F00BC4D8 /* SingleAssignmentDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAssignmentDisposable.swift; path = RxSwift/Disposables/SingleAssignmentDisposable.swift; sourceTree = ""; }; + C69F2408EF8B0C3BB7419872996ED01C /* SharedSequence+Operators+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SharedSequence+Operators+arity.swift"; path = "RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift"; sourceTree = ""; }; + C8FA0250F8F58859A42FACB6244CB83C /* Pods_ShadowsocksX_NG.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NG.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CA32EF7645C489DC5E33892504DE253D /* Using.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Using.swift; path = RxSwift/Observables/Using.swift; sourceTree = ""; }; + CDECDC826427AB1333B1485F32A721A3 /* Bag+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Bag+Rx.swift"; path = "RxSwift/Extensions/Bag+Rx.swift"; sourceTree = ""; }; CE50445A73ECB9A2ED31A6FF93D45808 /* Pods-proxy_conf_helper-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-proxy_conf_helper-dummy.m"; sourceTree = ""; }; - D0531FFA0D5305257F668D1D12A1411F /* Pods_ShadowsocksX_NGTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NGTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D184A55F942880B696653A33913ECF93 /* RxCocoaRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoaRuntime.h; path = RxCocoa/Runtime/include/RxCocoaRuntime.h; sourceTree = ""; }; - D1C4C6CEAFF5B39F833B3836EAAEC96C /* GCDWebServerFileRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFileRequest.m; path = GCDWebServer/Requests/GCDWebServerFileRequest.m; sourceTree = ""; }; - D3AEFA8AAF6328813FEC6D38028EF063 /* BinaryDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BinaryDisposable.swift; path = RxSwift/Disposables/BinaryDisposable.swift; sourceTree = ""; }; - D4632B46CC78EF8030FEB67D2D7C92DE /* Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reduce.swift; path = RxSwift/Observables/Reduce.swift; sourceTree = ""; }; - D6FA3B372E3D1861300774D9CACD4C15 /* RxSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-umbrella.h"; sourceTree = ""; }; + CE8A310F9FBC0D6FDD4C8E3D891605E1 /* Optional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Optional.swift; path = RxSwift/Observables/Optional.swift; sourceTree = ""; }; + CF3BEDFBB2197809F6BDAF649F36F20D /* ObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableType.swift; path = RxSwift/ObservableType.swift; sourceTree = ""; }; + D13F2EDEB0AC07D152FC818243513146 /* DefaultIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultIfEmpty.swift; path = RxSwift/Observables/DefaultIfEmpty.swift; sourceTree = ""; }; + D17DBC203AF5B8E02A628E6920BEC64B /* RxCocoaObjCRuntimeError+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RxCocoaObjCRuntimeError+Extensions.swift"; path = "RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift"; sourceTree = ""; }; + D18E7218EA86B1A581D12090718F1F3C /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D1EA13DE495837C31F4526D7FA1F7795 /* Deferred.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deferred.swift; path = RxSwift/Observables/Deferred.swift; sourceTree = ""; }; + D20F25597538DF7C1290E5ECF3BA6073 /* NSControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSControl+Rx.swift"; path = "RxCocoa/macOS/NSControl+Rx.swift"; sourceTree = ""; }; + D27F9B49B02CDF00CFD1E0CF066445B2 /* GCDWebServerURLEncodedFormRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerURLEncodedFormRequest.m; path = GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m; sourceTree = ""; }; + D37B5D016E968A982C96D680E27224E7 /* TakeWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeWhile.swift; path = RxSwift/Observables/TakeWhile.swift; sourceTree = ""; }; + D4498044F24BEEA463A62F313DBAF34A /* Cancelable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cancelable.swift; path = RxSwift/Cancelable.swift; sourceTree = ""; }; + D44EE75E565309CBCBA8CDC8C1F148EF /* BRLOptionParser.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BRLOptionParser.xcconfig; sourceTree = ""; }; + D4E00A40F2D4DE3318F31F4BD19FC986 /* SubscribeOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscribeOn.swift; path = RxSwift/Observables/SubscribeOn.swift; sourceTree = ""; }; + D5D00060FD1C8FC81DFDD4EAD1FC02BD /* PrimitiveSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PrimitiveSequence.swift; path = RxSwift/Traits/PrimitiveSequence.swift; sourceTree = ""; }; + D77C4845A393085D1F7FF68A785D6A6B /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; + D7C21F7B579D31839F9317289084E4FA /* RxMutableBox.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxMutableBox.swift; path = RxSwift/RxMutableBox.swift; sourceTree = ""; }; D7E8128F302CF60BEF206008CE11F6D3 /* Pods-ShadowsocksX-NGTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ShadowsocksX-NGTests-umbrella.h"; sourceTree = ""; }; - D82A11977CDF4CBC2948546163A27853 /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; - D8AAFB037FDFF7437E3006151BA5FE9B /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = ""; }; - D998C21F60B248C532A1ED016B5074E7 /* cs.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = cs.lproj; sourceTree = ""; }; - D9EBA3D67FF4AF63397A5FB0F6CF1B5F /* _RXDelegateProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXDelegateProxy.h; path = RxCocoa/Runtime/include/_RXDelegateProxy.h; sourceTree = ""; }; - DA02D299CE44B023D9B4909ED0B34FCC /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = RxSwift/Disposable.swift; sourceTree = ""; }; - DAD59D3D739C07FCB2F892826F951063 /* Amb.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amb.swift; path = RxSwift/Observables/Amb.swift; sourceTree = ""; }; + D80BBC49309E8C0FFEE8339DD05B1420 /* GCDWebServerDataRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerDataRequest.h; path = GCDWebServer/Requests/GCDWebServerDataRequest.h; sourceTree = ""; }; + D883EB96731562A3DB6A5D9BB316164D /* Throttle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Throttle.swift; path = RxSwift/Observables/Throttle.swift; sourceTree = ""; }; + D88C03DD8DB2FDBDB751F6E0573A19DF /* BehaviorSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorSubject.swift; path = RxSwift/Subjects/BehaviorSubject.swift; sourceTree = ""; }; + DB253165A9F6EDB8299D6D115FAEBD42 /* GCDWebServerDataResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerDataResponse.h; path = GCDWebServer/Responses/GCDWebServerDataResponse.h; sourceTree = ""; }; + DB7869CB7726942306727ACBE0A6CD4E /* GCDWebServerErrorResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerErrorResponse.m; path = GCDWebServer/Responses/GCDWebServerErrorResponse.m; sourceTree = ""; }; DC250BF8313F337272DBC9DE1FB6DB6B /* Pods-ShadowsocksX-NG.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-ShadowsocksX-NG.modulemap"; sourceTree = ""; }; - DCD30248F27B4938679C37883BDD134A /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = en.lproj; sourceTree = ""; }; - DCF0DD57FB4E2DED2BA043D232A8F3E9 /* SubscriptionDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionDisposable.swift; path = RxSwift/Disposables/SubscriptionDisposable.swift; sourceTree = ""; }; - DD8C09387A31AC5BF4B190F880F4883D /* HistoricalSchedulerTimeConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalSchedulerTimeConverter.swift; path = RxSwift/Schedulers/HistoricalSchedulerTimeConverter.swift; sourceTree = ""; }; - E0CF346DBA2C8BDB54C4D65E01BE83B4 /* libPods-proxy_conf_helper.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-proxy_conf_helper.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - E15756B54614ACA75251861D700E1946 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E1C50ACDF517D102DEC7195257ADFE7B /* Sink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sink.swift; path = RxSwift/Observables/Sink.swift; sourceTree = ""; }; - E1E128ED33CF5ECBE9E08D07D4B7672D /* MASLocalization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASLocalization.m; path = Framework/MASLocalization.m; sourceTree = ""; }; - E1E8E56BD7B85F3AF4B5FE7AF03AAEE8 /* Logging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logging.swift; path = RxCocoa/Foundation/Logging.swift; sourceTree = ""; }; - E2946829864608D127EB046EF8BAA69D /* ReplaySubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplaySubject.swift; path = RxSwift/Subjects/ReplaySubject.swift; sourceTree = ""; }; - E3637E3CB5915225EA71EFF6B20D7171 /* CompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CompositeDisposable.swift; path = RxSwift/Disposables/CompositeDisposable.swift; sourceTree = ""; }; - E366C7D398E704625CF7481FD8243D48 /* CombineLatest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombineLatest.swift; path = RxSwift/Observables/CombineLatest.swift; sourceTree = ""; }; - E3EFB1E8AA462C2C937015579F139C13 /* Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rx.swift; path = RxSwift/Rx.swift; sourceTree = ""; }; - E4EC11834E14E9B2C39B5615DA787A71 /* zh-Hant.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = "zh-Hant.lproj"; sourceTree = ""; }; - E515CE44A5FFCE8293899BD5AF596B7A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E58A2330CC4D40F78DD08B5A8500F8BF /* AsMaybe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsMaybe.swift; path = RxSwift/Observables/AsMaybe.swift; sourceTree = ""; }; - E5B859D5878DCF98B3D01C2C0615A78C /* GCDWebServerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerPrivate.h; path = GCDWebServer/Core/GCDWebServerPrivate.h; sourceTree = ""; }; - E5C53D1D9FD46ACD15E6C5381BD7A754 /* MASShortcutValidator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutValidator.h; path = Framework/MASShortcutValidator.h; sourceTree = ""; }; - E67F34DCD8ADF524683B1FDA27AA87D4 /* RxTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTarget.swift; path = RxCocoa/Common/RxTarget.swift; sourceTree = ""; }; - E6B7FB2F3741600EA98ED059FA99D203 /* RecursiveScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveScheduler.swift; path = RxSwift/Schedulers/RecursiveScheduler.swift; sourceTree = ""; }; - E707C81E7EB04DBC63A2429C29DABDA4 /* SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SharedSequence.swift; path = RxCocoa/Traits/SharedSequence/SharedSequence.swift; sourceTree = ""; }; - E88567B756C3B048C0FE65824DF88BF5 /* HistoricalScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalScheduler.swift; path = RxSwift/Schedulers/HistoricalScheduler.swift; sourceTree = ""; }; - E8D80F3DDE713A93804F0B81C53471BB /* _RXObjCRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXObjCRuntime.h; path = RxCocoa/Runtime/include/_RXObjCRuntime.h; sourceTree = ""; }; - E969B8C71DA98B913BC86FD4AC5574BD /* Window.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Window.swift; path = RxSwift/Observables/Window.swift; sourceTree = ""; }; - E9DD9AF410C94A598B2DE06E014C5DF0 /* GCDWebServerFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFunctions.h; path = GCDWebServer/Core/GCDWebServerFunctions.h; sourceTree = ""; }; - E9DE035DC4CC0F7DB299802037814F5E /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; + DC9CBF3F42BE77A6A4156483F6E7A677 /* Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Driver.swift; path = RxCocoa/Traits/Driver/Driver.swift; sourceTree = ""; }; + DD070E26B8B863382F7AA226CF6D5794 /* RxCocoa-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxCocoa-dummy.m"; sourceTree = ""; }; + DD640DDC7E829A09ED1072907C443481 /* GCDWebServerResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerResponse.h; path = GCDWebServer/Core/GCDWebServerResponse.h; sourceTree = ""; }; + DE7D4EDDDDBC9A8284DF4316C7F919EB /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = ""; }; + DF2D048928B85C0B72DFDA760FAC837E /* AsSingle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsSingle.swift; path = RxSwift/Observables/AsSingle.swift; sourceTree = ""; }; + E18663B7E781172BDC6EFC5AC77BA4FF /* GroupBy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupBy.swift; path = RxSwift/Observables/GroupBy.swift; sourceTree = ""; }; + E334CC8401F5E9485DACD3CF7F789B90 /* Buffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Buffer.swift; path = RxSwift/Observables/Buffer.swift; sourceTree = ""; }; + E356F07902E984F6D1B28C8BCA923455 /* SchedulerServices+Emulation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SchedulerServices+Emulation.swift"; path = "RxSwift/Schedulers/SchedulerServices+Emulation.swift"; sourceTree = ""; }; + E39B6AE9C7DBAF6F7102DDE428C6D4DA /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = ""; }; + E40D5C853F53872A9EDD51E2438864BC /* KVORepresentable+Swift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+Swift.swift"; path = "RxCocoa/Foundation/KVORepresentable+Swift.swift"; sourceTree = ""; }; + E417BF107A54D2027FCFA21115B0B6BF /* MASShortcut.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MASShortcut.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E4824FF61369273279E9C73FAE118858 /* ObservableConvertibleType+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableConvertibleType+SharedSequence.swift"; path = "RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift"; sourceTree = ""; }; + E66E142759BB10864774D2C94E961514 /* MASDictionaryTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASDictionaryTransformer.h; path = Framework/MASDictionaryTransformer.h; sourceTree = ""; }; + E66FAB44C7A517141189FD000F9B5DF5 /* zh-Hans.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = "zh-Hans.lproj"; sourceTree = ""; }; EA41BEE3B4D9F1A89F0135CA91A7F472 /* Pods-ShadowsocksX-NG-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ShadowsocksX-NG-resources.sh"; sourceTree = ""; }; EA9A1A86E1594EEC96C2B7214E16E50F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; - EAECCA61F07E82955E0CA24C52AAF475 /* BRLOptionParser.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BRLOptionParser.xcconfig; sourceTree = ""; }; - EB6C8C0D1FA8537542033F55E1556F6C /* Zip+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+Collection.swift"; path = "RxSwift/Observables/Zip+Collection.swift"; sourceTree = ""; }; - EBBFBC78787B38998069A1A51FB6277B /* _RX.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RX.m; path = RxCocoa/Runtime/_RX.m; sourceTree = ""; }; - EBF94F2FA57AC086015ECB43EABA8CE0 /* DelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxy.swift; path = RxCocoa/Common/DelegateProxy.swift; sourceTree = ""; }; - EF81F74434BA7B8FAE460E710314428D /* Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecated.swift; path = RxCocoa/Deprecated.swift; sourceTree = ""; }; + EAA642364AC03341491D3F3B2B55D566 /* Event.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Event.swift; path = RxSwift/Event.swift; sourceTree = ""; }; + EB7F2ED22A2C64159A4F936BFADE6E45 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + EC7D06D7C30521ACFE2CB8810BAD6EB4 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = ""; }; + EEF0E141DA73C02E3495E9BC4F3BCB79 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; + EF773B3F1B1F670D5A56FC9AC6EBE4D2 /* AnonymousObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObserver.swift; path = RxSwift/Observers/AnonymousObserver.swift; sourceTree = ""; }; + EF846AE7A2DE452AE4DCDE6EFBEC8B26 /* Scan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Scan.swift; path = RxSwift/Observables/Scan.swift; sourceTree = ""; }; + EF8570C25461953B9B13A259DDC88592 /* MASShortcut.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MASShortcut.xcconfig; sourceTree = ""; }; + EFB5583E95D9163093E1C43B391FFCC1 /* libPods-proxy_conf_helper.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-proxy_conf_helper.a"; sourceTree = BUILT_PRODUCTS_DIR; }; EFD468F10CD22B3EFAB406DAC3FCC7C9 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Carbon.framework; sourceTree = DEVELOPER_DIR; }; - EFF880C34F99282A87D40EEB06740D80 /* Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Driver.swift; path = RxCocoa/Traits/Driver/Driver.swift; sourceTree = ""; }; - F0581044A5A088C077656011651C2465 /* Empty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Empty.swift; path = RxSwift/Observables/Empty.swift; sourceTree = ""; }; - F2B901654D7B257777782F6F00162843 /* Timer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timer.swift; path = RxSwift/Observables/Timer.swift; sourceTree = ""; }; - F308400B0F508083F4F2C54D3F787C5E /* GCDWebServerConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerConnection.h; path = GCDWebServer/Core/GCDWebServerConnection.h; sourceTree = ""; }; - F316CF662715DAF0DC0D4AB967AD6709 /* ControlProperty+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlProperty+Driver.swift"; path = "RxCocoa/Traits/Driver/ControlProperty+Driver.swift"; sourceTree = ""; }; - F3C425613054D6B8A7DFF96BE0698489 /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = es.lproj; sourceTree = ""; }; - F3FE3FD846A162F26A05D064DE8B7C21 /* MASShortcut-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut-prefix.pch"; sourceTree = ""; }; - F452BDEBCDC82858ADCB26071AA4E12D /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; - F4E647FF308219F6F10EF468CFD459D1 /* MASShortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcut.h; path = Framework/MASShortcut.h; sourceTree = ""; }; - F546C188C97659BE86FA0E06FB1674BB /* DelaySubscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelaySubscription.swift; path = RxSwift/Observables/DelaySubscription.swift; sourceTree = ""; }; - F552E19724BF0CC37D66E1D5DA273720 /* MASShortcut-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MASShortcut-umbrella.h"; sourceTree = ""; }; - F656339EB8909181989F80623859B35C /* GCDWebServerDataRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerDataRequest.m; path = GCDWebServer/Requests/GCDWebServerDataRequest.m; sourceTree = ""; }; + EFF605517B8B672280D85EF59BDBBF89 /* NSObject+Rx+KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx+KVORepresentable.swift"; path = "RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift"; sourceTree = ""; }; + F12CA3526AFD49BC5CD55B6B6ED743C4 /* RxCocoa-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxCocoa-prefix.pch"; sourceTree = ""; }; + F1791718F5CC919CF52642A71FE4AAAF /* Materialize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Materialize.swift; path = RxSwift/Observables/Materialize.swift; sourceTree = ""; }; + F41F3F896039E0F2EE235A159F853B08 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; + F58912C1C682D706B91088B2E3E28849 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; + F5BEEA74769B7463104E20202E1A465D /* Concat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Concat.swift; path = RxSwift/Observables/Concat.swift; sourceTree = ""; }; + F63A805EDA3A375F4453D75E39B46EC1 /* Producer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Producer.swift; path = RxSwift/Observables/Producer.swift; sourceTree = ""; }; F67191B1F87DA238C4D87250DFBE43DD /* Pods-ShadowsocksX-NGTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ShadowsocksX-NGTests.release.xcconfig"; sourceTree = ""; }; - F8169698EDB7D60F459C13552F619848 /* Debounce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debounce.swift; path = RxSwift/Observables/Debounce.swift; sourceTree = ""; }; - F9164999952F9F74D2945D92DD778C19 /* GCDWebServerHTTPStatusCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerHTTPStatusCodes.h; path = GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h; sourceTree = ""; }; - FA95194E204F208C75DB1F2E683163B8 /* Bag+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Bag+Rx.swift"; path = "RxSwift/Extensions/Bag+Rx.swift"; sourceTree = ""; }; - FBAF339F33C80576683D76394CA51047 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FC1E04FFC51E6E05C344477E8DDB777E /* _RXKVOObserver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXKVOObserver.m; path = RxCocoa/Runtime/_RXKVOObserver.m; sourceTree = ""; }; - FC3F16342AABB95F2FB9FC98E52CF43E /* GCDWebServerDataResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerDataResponse.m; path = GCDWebServer/Responses/GCDWebServerDataResponse.m; sourceTree = ""; }; - FCD773B3B520BDB18A9BB4B403F9DC27 /* GCDWebServerErrorResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerErrorResponse.h; path = GCDWebServer/Responses/GCDWebServerErrorResponse.h; sourceTree = ""; }; - FD0A0C898D69E818B6F386B2CBA9012F /* GCDWebServerURLEncodedFormRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerURLEncodedFormRequest.h; path = GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h; sourceTree = ""; }; - FE7CDCDB0682EC04C12DD552E4910CE5 /* LockOwnerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LockOwnerType.swift; path = RxSwift/Concurrency/LockOwnerType.swift; sourceTree = ""; }; - FF074D96FBC0786D113FA8954363F7EF /* GCDWebServerDataRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerDataRequest.h; path = GCDWebServer/Requests/GCDWebServerDataRequest.h; sourceTree = ""; }; - FF9B0B9971EBD4F210054B63F172C41E /* MASShortcutBinder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutBinder.h; path = Framework/MASShortcutBinder.h; sourceTree = ""; }; - FFBD01DC827B96A71DBE4FF69755B797 /* NotificationCenter+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NotificationCenter+Rx.swift"; path = "RxCocoa/Foundation/NotificationCenter+Rx.swift"; sourceTree = ""; }; + F6958C5792CD090D53D51F45E3FC8391 /* SubscriptionDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionDisposable.swift; path = RxSwift/Disposables/SubscriptionDisposable.swift; sourceTree = ""; }; + F69A770E45055FD854F3FBD6979FC418 /* Just.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Just.swift; path = RxSwift/Observables/Just.swift; sourceTree = ""; }; + F735EC7A418D45C70CE0818AC93B4BA3 /* Maybe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Maybe.swift; path = RxSwift/Traits/Maybe.swift; sourceTree = ""; }; + F77DE488C839A9ACAE7A7BF4C24036BC /* Enumerated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Enumerated.swift; path = RxSwift/Observables/Enumerated.swift; sourceTree = ""; }; + F79B729FCFF408FC35D4D736823C9C54 /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; path = it.lproj; sourceTree = ""; }; + F8443ACD9BB292ED1C07002A2677C9A6 /* ControlTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlTarget.swift; path = RxCocoa/Common/ControlTarget.swift; sourceTree = ""; }; + F905EE6F0E88BD8C5751FFC92BFFE94A /* BRLOptionParser-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BRLOptionParser-prefix.pch"; sourceTree = ""; }; + F998ED9B73E72761135D03EABEA4CF52 /* ControlProperty+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlProperty+Driver.swift"; path = "RxCocoa/Traits/Driver/ControlProperty+Driver.swift"; sourceTree = ""; }; + F9A3C739C0FF5F8BD8B24A9AF4939DC2 /* ObservableConvertibleType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableConvertibleType.swift; path = RxSwift/ObservableConvertibleType.swift; sourceTree = ""; }; + FA0D68D388D0343FA7D9603F2972F301 /* AsyncLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncLock.swift; path = RxSwift/Concurrency/AsyncLock.swift; sourceTree = ""; }; + FA4CD1F6811E9C48888466AB8169A09B /* VirtualTimeConverterType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeConverterType.swift; path = RxSwift/Schedulers/VirtualTimeConverterType.swift; sourceTree = ""; }; + FB5D3778780DA8CAF8A3068FF9DFDC57 /* VirtualTimeScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeScheduler.swift; path = RxSwift/Schedulers/VirtualTimeScheduler.swift; sourceTree = ""; }; + FB8175F2ECF55A3974C3B9F8F610B7E4 /* NSButton+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSButton+Rx.swift"; path = "RxCocoa/macOS/NSButton+Rx.swift"; sourceTree = ""; }; + FBC4E57263B9AAECCE6AE5CA60FBB422 /* RxSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-umbrella.h"; sourceTree = ""; }; + FC2C8FAFAE7C8BCB3D9CC3ED192B4B94 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FCAC7C3176AFDC0CD3DD5D9184E33909 /* NotificationCenter+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NotificationCenter+Rx.swift"; path = "RxCocoa/Foundation/NotificationCenter+Rx.swift"; sourceTree = ""; }; + FE9523A3F66C7512A04D217B9485ED49 /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = ""; }; + FEC68B3F3AAE886E35269B85EAAAA4A2 /* SchedulerType+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SchedulerType+SharedSequence.swift"; path = "RxCocoa/Traits/SharedSequence/SchedulerType+SharedSequence.swift"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -833,41 +857,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 00A280D4C78AFD320A4205C6BF2884BE /* Core */ = { - isa = PBXGroup; - children = ( - 2738692BF965EDDE0CDA5B4D08899095 /* GCDWebServer.h */, - A9826B12E4E987A2B073DA6D32BBA53C /* GCDWebServer.m */, - F308400B0F508083F4F2C54D3F787C5E /* GCDWebServerConnection.h */, - A30C48C8ED1D9EC8231B3D871BC285C7 /* GCDWebServerConnection.m */, - FF074D96FBC0786D113FA8954363F7EF /* GCDWebServerDataRequest.h */, - F656339EB8909181989F80623859B35C /* GCDWebServerDataRequest.m */, - 3A338EA0CA1FE047514C4AE30D1EC601 /* GCDWebServerDataResponse.h */, - FC3F16342AABB95F2FB9FC98E52CF43E /* GCDWebServerDataResponse.m */, - FCD773B3B520BDB18A9BB4B403F9DC27 /* GCDWebServerErrorResponse.h */, - 572BE12282110872C7D8E7EF29A5033C /* GCDWebServerErrorResponse.m */, - C952CFCB4CF5FD55CFE8949FD41C9460 /* GCDWebServerFileRequest.h */, - D1C4C6CEAFF5B39F833B3836EAAEC96C /* GCDWebServerFileRequest.m */, - 09187F1FBD16DDE0A198691271E6D322 /* GCDWebServerFileResponse.h */, - 0F5B2D680B55A87168B90861D051B746 /* GCDWebServerFileResponse.m */, - E9DD9AF410C94A598B2DE06E014C5DF0 /* GCDWebServerFunctions.h */, - 0FB611A2D6465F53874DE91ED2D760BF /* GCDWebServerFunctions.m */, - F9164999952F9F74D2945D92DD778C19 /* GCDWebServerHTTPStatusCodes.h */, - 00CECA213B3AA462DCD88A69F686C862 /* GCDWebServerMultiPartFormRequest.h */, - CD3F084299BD99D03F6B8FC8783B3AE8 /* GCDWebServerMultiPartFormRequest.m */, - E5B859D5878DCF98B3D01C2C0615A78C /* GCDWebServerPrivate.h */, - 58CB4D7A6C8CB1B887645BE2595AFC0E /* GCDWebServerRequest.h */, - 22EE8CE9A144E74E024FCD831B543700 /* GCDWebServerRequest.m */, - 6B432AF0284AA5FB0D45EED8A72A6B1A /* GCDWebServerResponse.h */, - 72B8CEB9D05921D08AA078AE17F53770 /* GCDWebServerResponse.m */, - 5222FC0287904A0C1050B9B01E9712F8 /* GCDWebServerStreamedResponse.h */, - B677B77B72CD0E70D2DC5499A6D18B31 /* GCDWebServerStreamedResponse.m */, - FD0A0C898D69E818B6F386B2CBA9012F /* GCDWebServerURLEncodedFormRequest.h */, - 7D03BE981ABF583B8C0A9733FC4E7758 /* GCDWebServerURLEncodedFormRequest.m */, - ); - name = Core; - sourceTree = ""; - }; 07568FCBBF071BD2EE0E5EBA001A4712 /* Pods-ShadowsocksX-NGTests */ = { isa = PBXGroup; children = ( @@ -886,180 +875,428 @@ path = "Target Support Files/Pods-ShadowsocksX-NGTests"; sourceTree = ""; }; - 28F32049EBD3188D559CD7D71D5BE9BE /* RxCocoa */ = { + 3F41528D8527E7927A277FE059F9FC77 /* Support Files */ = { isa = PBXGroup; children = ( - 2FFA998983771BA589140ED254CFBD48 /* _RX.h */, - EBBFBC78787B38998069A1A51FB6277B /* _RX.m */, - D9EBA3D67FF4AF63397A5FB0F6CF1B5F /* _RXDelegateProxy.h */, - 72FDEB0BDDFCA5B67411693DCA3BAB36 /* _RXDelegateProxy.m */, - 9B31A4E3C1E226E2FB724AB96C882B5A /* _RXKVOObserver.h */, - FC1E04FFC51E6E05C344477E8DDB777E /* _RXKVOObserver.m */, - E8D80F3DDE713A93804F0B81C53471BB /* _RXObjCRuntime.h */, - 986B511A99FF2CD40FF4907FE5DBAD8F /* _RXObjCRuntime.m */, - 4B3925E8418FB15723527909346442D9 /* Bag.swift */, - 0D9D5A3377EF4CDADE4D80FC29C1F20E /* ControlEvent.swift */, - 22D55ADD097A4317EEBBEAC8CA5D2328 /* ControlEvent+Driver.swift */, - 255132D91D9485882D3509D158D686F2 /* ControlProperty.swift */, - F316CF662715DAF0DC0D4AB967AD6709 /* ControlProperty+Driver.swift */, - 0C165CADEE8873C8F5D15A02BF1AF555 /* ControlTarget.swift */, - EBF94F2FA57AC086015ECB43EABA8CE0 /* DelegateProxy.swift */, - 863E188823EC0A70B5265256ECE53AA4 /* DelegateProxyType.swift */, - EF81F74434BA7B8FAE460E710314428D /* Deprecated.swift */, - 5FC9E4C5BE139DEDCF232F464EEE5F9A /* DispatchQueue+Extensions.swift */, - EFF880C34F99282A87D40EEB06740D80 /* Driver.swift */, - 30FAB42EC783B04EAEDCA833EB48269E /* Driver+Subscription.swift */, - E9DE035DC4CC0F7DB299802037814F5E /* InfiniteSequence.swift */, - 4FF0A1029048B0747EEF9A0E552FE307 /* KVORepresentable.swift */, - 261420BDDFD507E93CA5EEE0286F0D2B /* KVORepresentable+CoreGraphics.swift */, - 7A20F2D6B7A2D475A3BEF0CAFE123400 /* KVORepresentable+Swift.swift */, - E1E8E56BD7B85F3AF4B5FE7AF03AAEE8 /* Logging.swift */, - FFBD01DC827B96A71DBE4FF69755B797 /* NotificationCenter+Rx.swift */, - 0FD7A0DC3ED806805A328B6E3183B3DD /* NSButton+Rx.swift */, - AE7C79F11D25CEDB1D05648901AFF01D /* NSControl+Rx.swift */, - 23A34F10DBCE77625288E96057F56456 /* NSImageView+Rx.swift */, - 1C3FED0A19AFEE0E97C077B535ABB44E /* NSLayoutConstraint+Rx.swift */, - 901EFAF9E76AF0F9D3DBC7CE6212D4B8 /* NSObject+Rx.swift */, - 5945D007DC7A2B629B8E5987E6184267 /* NSObject+Rx+KVORepresentable.swift */, - 1A1567F5FA8FE7F8CB94FF8182AFE361 /* NSObject+Rx+RawRepresentable.swift */, - 2F67068FE91E63222D2D32C4BB3BBCBD /* NSSlider+Rx.swift */, - 346BBFB5B79A5139190296845F41C8DE /* NSTextField+Rx.swift */, - 9352AFD1D6C6B57A9AF36DD5277BB196 /* NSView+Rx.swift */, - 2CC9430D7E7FB49F1A03FD83C0F15DF0 /* Observable+Bind.swift */, - 8209A41698505C3145781FDD26E699EE /* ObservableConvertibleType+Driver.swift */, - 728798194C8FC2BA7D507A14593C9C6F /* ObservableConvertibleType+SharedSequence.swift */, - C1F68587D16CABA9C7433492E59AB224 /* Platform.Darwin.swift */, - 09C2A8F904CF4DBCBEF9D102DBD74AFD /* Platform.Linux.swift */, - 6180F60B96D97B62E15F102AA5722741 /* PriorityQueue.swift */, - 9B539B1FEB1247454F06F69690A74881 /* Queue.swift */, - 881AB2BAED9DBD8D39A04DCCFD4A871B /* RecursiveLock.swift */, - 533BCDFF477A8BB66A84035182761408 /* RxCocoa.h */, - 9487D19A313750E8B3F0DDB32B87E864 /* RxCocoa.swift */, - 5B6B335F7D4B0FC8875810068B493F55 /* RxCocoaObjCRuntimeError+Extensions.swift */, - D184A55F942880B696653A33913ECF93 /* RxCocoaRuntime.h */, - E67F34DCD8ADF524683B1FDA27AA87D4 /* RxTarget.swift */, - 82B6A945EDCE3039C33A744E0206424D /* SectionedViewDataSourceType.swift */, - E707C81E7EB04DBC63A2429C29DABDA4 /* SharedSequence.swift */, - 1F9FB942372907FC74EEC9507F4F190D /* SharedSequence+Operators.swift */, - 606D277095EEA4BF6FEB8D9270E15542 /* SharedSequence+Operators+arity.swift */, - 9480F95CFFC2D8DA4D91AE587BFF20B8 /* TextInput.swift */, - 788FB43AEDD6D9FD2ECBD95EAC8A97E5 /* UIBindingObserver.swift */, - 02D69B5B9B62BE6A7900C1039EFEA2BC /* URLSession+Rx.swift */, - A040CC73BFCA8B9320CEF555F949D711 /* Variable+Driver.swift */, - 7206D6A8DAD7ADCD7E85D9D080C6BACB /* Variable+SharedSequence.swift */, - FAE79CDC2C7965FFEF8DC80E6B817A6B /* Support Files */, + 04BAD8299F0B7A65CFCE251F1F7722C0 /* Alamofire.modulemap */, + 4CE700501A5FBA06F359007666C43958 /* Alamofire.xcconfig */, + 06FF1E1D8696715F0476C721349ABF4A /* Alamofire-dummy.m */, + 9BCF18187EC77D481751E793B1B99458 /* Alamofire-prefix.pch */, + D77C4845A393085D1F7FF68A785D6A6B /* Alamofire-umbrella.h */, + EB7F2ED22A2C64159A4F936BFADE6E45 /* Info.plist */, ); - path = RxCocoa; + name = "Support Files"; + path = "../Target Support Files/Alamofire"; sourceTree = ""; }; - 4F38A79FE026B54D13A4ADE87802BA23 /* Resources */ = { + 4B6B0D327DA58988CCE4B33397397D74 /* Support Files */ = { isa = PBXGroup; children = ( - D998C21F60B248C532A1ED016B5074E7 /* cs.lproj */, - 200EE4899584F5D5767A63F4E7E1A627 /* de.lproj */, - DCD30248F27B4938679C37883BDD134A /* en.lproj */, - F3C425613054D6B8A7DFF96BE0698489 /* es.lproj */, - 5603B5E9D6CFF759B07667A13C90112C /* fr.lproj */, - 48930EE93B15635DB1DC641A949AB58E /* it.lproj */, - B8342F1DDDA13DCD8CF77080A6A16BCC /* ja.lproj */, - 2255320841E837341A064E1387C85F85 /* ko.lproj */, - 7EE2EE9316F755CDB7B2D29A98063559 /* nl.lproj */, - 6786640F8B195A8E8E18BE5034B98BDD /* pl.lproj */, - 3CD46935CE54DAD2A7350CB2E4DB048C /* ru.lproj */, - 8700E99248E4432CC4DC446DE4A91E41 /* zh-Hans.lproj */, - E4EC11834E14E9B2C39B5615DA787A71 /* zh-Hant.lproj */, + 2D190E53FA2881C4C0669D0F0367DE31 /* Info.plist */, + 679166C482C63EB7F940FE7A6476274B /* MASShortcut.modulemap */, + EF8570C25461953B9B13A259DDC88592 /* MASShortcut.xcconfig */, + C54EAA06C0712228D110E5F33FD72EC9 /* MASShortcut-dummy.m */, + C045555E3D465D287E7928F6180E1B12 /* MASShortcut-prefix.pch */, + ABEF7628490A51F0ED3BE67393DEB56E /* MASShortcut-umbrella.h */, + 124A08134F4F0DFD6C6D5F5B29F0F045 /* ResourceBundle-MASShortcut-Info.plist */, ); - name = Resources; + name = "Support Files"; + path = "../Target Support Files/MASShortcut"; sourceTree = ""; }; - 5739D868472AD947DBFB4A27A0D08D8B /* Pods */ = { + 50D8BF310E0933E0B29656BDF88A05CF /* Core */ = { isa = PBXGroup; children = ( - B17E9640A1D4A8265ADA3D9996A2F88A /* Alamofire */, - ECCA55967A058AAF061006AC31FD7B9D /* BRLOptionParser */, - FD9B6873D4081C5CCEF69576498728B2 /* GCDWebServer */, - F2148EAFEC18D957377DC614F758C944 /* MASShortcut */, - 28F32049EBD3188D559CD7D71D5BE9BE /* RxCocoa */, - D39D89B6092E13E49DACCE731274D097 /* RxSwift */, + 2C34C0B46CA55D9826447C6EF5667B77 /* GCDWebServer.h */, + 1C34DF9211C78641101C8029D821282C /* GCDWebServer.m */, + B7C8CD3DFA056CB378EA8126D471FE4D /* GCDWebServerConnection.h */, + B458372D1D2009A7FDC10C7A5379CF07 /* GCDWebServerConnection.m */, + D80BBC49309E8C0FFEE8339DD05B1420 /* GCDWebServerDataRequest.h */, + 8DF79E5957660D27729BE2711F7510D5 /* GCDWebServerDataRequest.m */, + DB253165A9F6EDB8299D6D115FAEBD42 /* GCDWebServerDataResponse.h */, + 25BD92FA972425CD9706F8177394D7DF /* GCDWebServerDataResponse.m */, + 3DD66E9E374587EE9AC648D811B5042E /* GCDWebServerErrorResponse.h */, + DB7869CB7726942306727ACBE0A6CD4E /* GCDWebServerErrorResponse.m */, + BEA567412780FF078C4F7D7AEEA21AD2 /* GCDWebServerFileRequest.h */, + 125D906DA6D12CC4B558691B8F324B0F /* GCDWebServerFileRequest.m */, + 00208F1C08F49846BFE1A47C2AD5C562 /* GCDWebServerFileResponse.h */, + 4FEDBA21F3681BC1FBEB4E058BDEF1E4 /* GCDWebServerFileResponse.m */, + 1056A640AEFE50B38D2344C0B944DC50 /* GCDWebServerFunctions.h */, + 78BF2C0D1D2976671C6F01E7CF57B7D8 /* GCDWebServerFunctions.m */, + 88223CC64D20FAA41D33B56DA90F1829 /* GCDWebServerHTTPStatusCodes.h */, + 82AB01A10760A9DBC7F68ACDB184CB9F /* GCDWebServerMultiPartFormRequest.h */, + 83A9CCC244BECF2D84BC459532DA1B78 /* GCDWebServerMultiPartFormRequest.m */, + BDAA1AF05A1F0B1B7C16588267607FE1 /* GCDWebServerPrivate.h */, + 4E035F93086E0E9404B6C0C525F9F238 /* GCDWebServerRequest.h */, + 1C6FF8174AF3551817D3375622AD00A6 /* GCDWebServerRequest.m */, + DD640DDC7E829A09ED1072907C443481 /* GCDWebServerResponse.h */, + 02C1C424F1F955C157E2AD0DF9DA85CA /* GCDWebServerResponse.m */, + 5F53F9BE0FC6F1436AD8032E8FF6D80D /* GCDWebServerStreamedResponse.h */, + 987AC2089C4B4C35C212D30E0C0E7B9A /* GCDWebServerStreamedResponse.m */, + 399E2B8BEE8E886EE4016D87C5C85C63 /* GCDWebServerURLEncodedFormRequest.h */, + D27F9B49B02CDF00CFD1E0CF066445B2 /* GCDWebServerURLEncodedFormRequest.m */, ); - name = Pods; + name = Core; sourceTree = ""; }; - 6F4F4AB09FF3EB5CF87F58B472407041 /* Support Files */ = { + 57B3F389DDA7629AE17CC01B90DDFFD1 /* Products */ = { isa = PBXGroup; children = ( - 60A4BC59E7923D49D1F2DB66CC93CEF6 /* Info.plist */, - 130F7474B10251411E8A0B0095FA77F1 /* RxSwift.modulemap */, - 159548EDEA83A8DE85452C6B8DEB4043 /* RxSwift.xcconfig */, - 33607CFF1CB9E42C89084F9C17E407B0 /* RxSwift-dummy.m */, - BBB5913EEAFF6831515284D85F9B42AB /* RxSwift-prefix.pch */, - D6FA3B372E3D1861300774D9CACD4C15 /* RxSwift-umbrella.h */, + A6FA4BF27FB90B714947E536885E37C1 /* Alamofire.framework */, + B3193AEA5372872BA57804AA2CAE1875 /* GCDWebServer.framework */, + 63F95A3FB354F1B43BC3C7CCA7C48037 /* libBRLOptionParser.a */, + EFB5583E95D9163093E1C43B391FFCC1 /* libPods-proxy_conf_helper.a */, + 711B62B6A01799BBCBA4F90D70C6AF28 /* MASShortcut.bundle */, + E417BF107A54D2027FCFA21115B0B6BF /* MASShortcut.framework */, + C8FA0250F8F58859A42FACB6244CB83C /* Pods_ShadowsocksX_NG.framework */, + 9D966DC3E49AE0BCCC9A1CA03C275F22 /* Pods_ShadowsocksX_NGTests.framework */, + D18E7218EA86B1A581D12090718F1F3C /* RxCocoa.framework */, + 60D7A87958991203E6AEEF88F8165CB1 /* RxSwift.framework */, ); - name = "Support Files"; - path = "../Target Support Files/RxSwift"; + name = Products; sourceTree = ""; }; - 785842678515C4CDC9428DD20DCD752D /* Targets Support Files */ = { + 5B3B3628BA886BD5CC873215255A3181 /* RxSwift */ = { isa = PBXGroup; children = ( - B5020B0A649E766997C633601AD85F17 /* Pods-proxy_conf_helper */, - 93AB896DD6AD247E69959A4B8C06F5AC /* Pods-ShadowsocksX-NG */, - 07568FCBBF071BD2EE0E5EBA001A4712 /* Pods-ShadowsocksX-NGTests */, + 9589591754500401F219D9EC60BB6AD7 /* AddRef.swift */, + 7FF0F128359723A54E21FEBB2D99C657 /* Amb.swift */, + AB8E26A34CAE0B693F1F2C52465402C3 /* AnonymousDisposable.swift */, + EF773B3F1B1F670D5A56FC9AC6EBE4D2 /* AnonymousObserver.swift */, + 22ECE1CB75987611F39ADE574AA7352C /* AnyObserver.swift */, + 1D0C71FC59A714120E705919A119EB9C /* AsMaybe.swift */, + DF2D048928B85C0B72DFDA760FAC837E /* AsSingle.swift */, + FA0D68D388D0343FA7D9603F2972F301 /* AsyncLock.swift */, + 9B62CFED1E64A9E67642177FF31ADAB0 /* AsyncSubject.swift */, + 9E5ED856E0033C185BB3A1CFF513A42C /* Bag.swift */, + CDECDC826427AB1333B1485F32A721A3 /* Bag+Rx.swift */, + D88C03DD8DB2FDBDB751F6E0573A19DF /* BehaviorSubject.swift */, + C143DF478B2ECD2870DC326426CCA893 /* BinaryDisposable.swift */, + 7849EB1549B76C509FCE0465C3EC6585 /* BooleanDisposable.swift */, + E334CC8401F5E9485DACD3CF7F789B90 /* Buffer.swift */, + D4498044F24BEEA463A62F313DBAF34A /* Cancelable.swift */, + 48FCACAB173ADA2C6A483176B8C97F66 /* Catch.swift */, + 812492787E3005F375F66430EEFEB2D3 /* CombineLatest.swift */, + 53901D4BDA021937287E33B4491AA200 /* CombineLatest+arity.swift */, + B98A2E7455847993E52C3245DF62ACCE /* CombineLatest+Collection.swift */, + 8F5083A9395E7BC273257A316BA5D517 /* Completable.swift */, + B1FE5441218FAE87F6E57A87233B4A0F /* Completable+AndThen.swift */, + 9445256D5E0C36ADD934F62A67B04A09 /* CompositeDisposable.swift */, + F5BEEA74769B7463104E20202E1A465D /* Concat.swift */, + 740D1DD30811098DBF267CA2EBAF0448 /* ConcurrentDispatchQueueScheduler.swift */, + 7BF437276A9A9AD2789D809F09705992 /* ConcurrentMainScheduler.swift */, + 44F80D944345E3B50B5CFF78E7C4E4D9 /* ConnectableObservableType.swift */, + ABE0B812B00B54AA2F6982337A7172A2 /* Create.swift */, + 938FC605EEA4041CA074FE17C4D53535 /* CurrentThreadScheduler.swift */, + 12173B3EF2DB80B33497504CD28D0D25 /* Debounce.swift */, + 33710F9F62AA2B36412EA7B08233352D /* Debug.swift */, + D13F2EDEB0AC07D152FC818243513146 /* DefaultIfEmpty.swift */, + D1EA13DE495837C31F4526D7FA1F7795 /* Deferred.swift */, + 88AACF5B7E188D3448847253899BFC8F /* Delay.swift */, + A0F9D84DF77D8398558F3D4F5FD606DB /* DelaySubscription.swift */, + 87372668A1EA52537C962C8365145B96 /* Dematerialize.swift */, + 8EC9ECCC54FEA683BBDB8B5CD94124B1 /* Deprecated.swift */, + B4D23B3353252A87A2DFCBE6BCAC355C /* DeprecationWarner.swift */, + 8B234AB54ABD1C374D34665C3DCD649E /* DispatchQueue+Extensions.swift */, + 0141E6A6B4EB3619B0171F6D6AF2EE49 /* DispatchQueueConfiguration.swift */, + B96C6614EE1F3536C3C06892684F2657 /* Disposable.swift */, + 218389799BBF34D96B7BDE06ECC09CD9 /* Disposables.swift */, + B1FECC6066F8385524F9B523590A82C8 /* DisposeBag.swift */, + 8B8C0CBA55B2D8C521EC4555A764C4A3 /* DisposeBase.swift */, + 8289A948846D9CADF1D390856F40AF89 /* DistinctUntilChanged.swift */, + 3413B9348C850EE5AE49C8B95B12943D /* Do.swift */, + 5EA75FB12559EF9F38DE81CA6685BE6C /* ElementAt.swift */, + 62C6E1F6DE2D3160BDD5B13FBF1DD877 /* Empty.swift */, + F77DE488C839A9ACAE7A7BF4C24036BC /* Enumerated.swift */, + 68F3C7D40CA579EFBF45E9BDF4844714 /* Error.swift */, + 78755706F21BACDBA952EF615AE4223F /* Errors.swift */, + EAA642364AC03341491D3F3B2B55D566 /* Event.swift */, + 22693A1922310B1DDCE8D9B91AA49677 /* Filter.swift */, + 5D4898D741BB7A3E63AD3625C5913FF4 /* First.swift */, + 920735A244F39A83F52DF97FA4E7427B /* Generate.swift */, + E18663B7E781172BDC6EFC5AC77BA4FF /* GroupBy.swift */, + 28578489FE91CF078CD23E26E04E3BBB /* GroupedObservable.swift */, + 28409654F83C1BED4A04990DF2A46117 /* HistoricalScheduler.swift */, + B61C725932BE55BD3F51C1611F4C00E1 /* HistoricalSchedulerTimeConverter.swift */, + 257A51892B0489327105FAC5C85056BB /* ImmediateSchedulerType.swift */, + 7B940616A1513AFB926A1625599603BF /* InfiniteSequence.swift */, + 1384B3A09ECFD78F3EFC1FE31AF7DE8D /* InvocableScheduledItem.swift */, + 0FF3E0A37CDE9554E186BAE00CD9C197 /* InvocableType.swift */, + F69A770E45055FD854F3FBD6979FC418 /* Just.swift */, + 23A3D60EBC5FA9D3A2E4ACFAD6428316 /* Lock.swift */, + B2F7E00EE5AC554A4695B58D3E0EEC68 /* LockOwnerType.swift */, + 8CF4A5D83CF4FF7422C8E7F007410BA4 /* MainScheduler.swift */, + 1DF905835162609C61FE7431CEAEFE06 /* Map.swift */, + F1791718F5CC919CF52642A71FE4AAAF /* Materialize.swift */, + F735EC7A418D45C70CE0818AC93B4BA3 /* Maybe.swift */, + A0A874527BA87240185BA903D136C3AF /* Merge.swift */, + 1D3126A27429E648B79C41215C88F13B /* Multicast.swift */, + 40EA3D109B9CB1C1BBDC2E9255B38366 /* Never.swift */, + 294B1F176E9A1CBCB03CF68E8A428BFB /* NopDisposable.swift */, + AECFBD9B4972BED36C6D3ACC0177E0E5 /* Observable.swift */, + F9A3C739C0FF5F8BD8B24A9AF4939DC2 /* ObservableConvertibleType.swift */, + CF3BEDFBB2197809F6BDAF649F36F20D /* ObservableType.swift */, + 48320B8075CDD3A66743F2FB1C0AEE97 /* ObservableType+Extensions.swift */, + 51298DE535C414C093FA9AEE5A210C4E /* ObservableType+PrimitiveSequence.swift */, + 4EB0F48DB0F38B80DF2708AB2292F08B /* ObserveOn.swift */, + C15620E5544258EF1AEC163EC547C2E3 /* ObserverBase.swift */, + 3C4B04EEA1AC1BE33D71036DEBEBF937 /* ObserverType.swift */, + C38541370FCAF5848E3402B758806B42 /* OperationQueueScheduler.swift */, + CE8A310F9FBC0D6FDD4C8E3D891605E1 /* Optional.swift */, + 2BF7CE3A988F181B6A3CCFCDAA25B69E /* Platform.Darwin.swift */, + 08CE7BAE0F6A7178D9136F1DBE9CE0D3 /* Platform.Linux.swift */, + D5D00060FD1C8FC81DFDD4EAD1FC02BD /* PrimitiveSequence.swift */, + 24D58CC8AA50BE13352501DE5BA68B94 /* PrimitiveSequence+Zip+arity.swift */, + FE9523A3F66C7512A04D217B9485ED49 /* PriorityQueue.swift */, + F63A805EDA3A375F4453D75E39B46EC1 /* Producer.swift */, + 79369DACA0CF3D56E9D4D213125DD2D2 /* PublishSubject.swift */, + C57692BA24E650520C1D877523C0A5F0 /* Queue.swift */, + 09A7C38F0BA34490FE74D086703D0869 /* Range.swift */, + 04D3D547F7C9D93D846B18B3598139D0 /* Reactive.swift */, + B55BFBC972E986BB01725A95A9860DA2 /* RecursiveLock.swift */, + 52EE2194BA2C33781397BBEB8F4C9276 /* RecursiveScheduler.swift */, + A96B9F66608C047F1379AAE238F18C2A /* Reduce.swift */, + 1F7B1AB25111B41EA516AC2B26F16FB4 /* RefCountDisposable.swift */, + 94342D18D6FF2890EDEEBE3520A6E66E /* Repeat.swift */, + 2FD70811FA75DA891378A68B3B6B4E2E /* ReplaySubject.swift */, + 7566FCCEEDFE8B433D83AD311795E367 /* RetryWhen.swift */, + 37302F3E1098B88606F9963B2BFF7A3F /* Rx.swift */, + D7C21F7B579D31839F9317289084E4FA /* RxMutableBox.swift */, + 82C92E152F7133108027B5F35A4EA2F6 /* Sample.swift */, + EF846AE7A2DE452AE4DCDE6EFBEC8B26 /* Scan.swift */, + 29D5C9E52C36A6630A4B5F4A54F3666E /* ScheduledDisposable.swift */, + 617D6EBFA395952801772F1383AB8AAE /* ScheduledItem.swift */, + 5A1C35E455A2F2765CD140138D5A1EEF /* ScheduledItemType.swift */, + E356F07902E984F6D1B28C8BCA923455 /* SchedulerServices+Emulation.swift */, + 41C0048A00AC76527EB7E552AC524DAC /* SchedulerType.swift */, + 2977417D444B5687C65F2845036F130C /* Sequence.swift */, + 454DCFB400BFCA2DD8E4C2EC61190701 /* SerialDispatchQueueScheduler.swift */, + 5D0E7B6D1939F2FFB2328BAA55AB8D33 /* SerialDisposable.swift */, + 8DDB54ED8FEE2C1E06EFC2F722F8735C /* ShareReplayScope.swift */, + 9308FACB56EF2744A5DF058B75203AE6 /* Single.swift */, + C65BFED56C12E4DDC34449B0F00BC4D8 /* SingleAssignmentDisposable.swift */, + 239930698028F8A7F8F0AF8660885A40 /* SingleAsync.swift */, + 88AC45588E239E491BA98259039A6802 /* Sink.swift */, + 091B320AF46DFF5E52B1CA91938163BC /* Skip.swift */, + C2A1585CB16C85AE91BDB4B9405928A2 /* SkipUntil.swift */, + 0C851BCF7777F05B23845D5F3B42477A /* SkipWhile.swift */, + 1910F3BA8275DA306C03AAF91366CA17 /* StartWith.swift */, + 5B1C0E5A2AF56FCCFCBBA2373F04E7C8 /* String+Rx.swift */, + 3CB0942D626105573A56A84ACEC555FE /* SubjectType.swift */, + D4E00A40F2D4DE3318F31F4BD19FC986 /* SubscribeOn.swift */, + F6958C5792CD090D53D51F45E3FC8391 /* SubscriptionDisposable.swift */, + ABCEC9093299246040636BFC7D014387 /* SwiftSupport.swift */, + 91E0555770D3BEC1183279EBBF63B6EB /* Switch.swift */, + 6CA83DA1CEDBDC939542356592B40AB3 /* SwitchIfEmpty.swift */, + 98923078307F200863DB7C59FCFC7002 /* SynchronizedDisposeType.swift */, + 0716C7A069A21844C312E62BBD3AC258 /* SynchronizedOnType.swift */, + 43D1F9A72CB74DED14E390F65E400A19 /* SynchronizedUnsubscribeType.swift */, + 6C82EAFB5F96FA6732152002CA4666CC /* TailRecursiveSink.swift */, + 121D3DED6F325810B808C962150FDF6B /* Take.swift */, + 9A0D3BBA7497A389734E9EEFBAE2464D /* TakeLast.swift */, + 6756FEC1B269A6CF56EF4D67F08E050B /* TakeUntil.swift */, + D37B5D016E968A982C96D680E27224E7 /* TakeWhile.swift */, + D883EB96731562A3DB6A5D9BB316164D /* Throttle.swift */, + AF97805B59E93B8CDD1F35ADC2C1160C /* Timeout.swift */, + 17B662771CEFD0C752DAF2C38021A7EB /* Timer.swift */, + A604573634B3B440BAC80E6185340643 /* ToArray.swift */, + CA32EF7645C489DC5E33892504DE253D /* Using.swift */, + FA4CD1F6811E9C48888466AB8169A09B /* VirtualTimeConverterType.swift */, + FB5D3778780DA8CAF8A3068FF9DFDC57 /* VirtualTimeScheduler.swift */, + 4591C0BC6376C1566FEA09D9C716AB84 /* Window.swift */, + 9FD412C15BC617CC38E190F17BB06655 /* WithLatestFrom.swift */, + 1B3420B97151695E8A4E232D9A929713 /* Zip.swift */, + 91CE07E2C296F1B3388DC2668BAB1341 /* Zip+arity.swift */, + C558DBA8867D3525206597226AB7FEAC /* Zip+Collection.swift */, + 8A25A387472EAD5BB30DAAB83258C32E /* Support Files */, ); - name = "Targets Support Files"; + path = RxSwift; sourceTree = ""; }; - 790B69D60BC48E76772183AD8030677E /* Support Files */ = { + 616C5106F0376E5EC82A41692B9F5189 /* Support Files */ = { isa = PBXGroup; children = ( - EAECCA61F07E82955E0CA24C52AAF475 /* BRLOptionParser.xcconfig */, - 1D373DA90C38C00B903B1FD9CD05CEC4 /* BRLOptionParser-dummy.m */, - B362693E8CB87D85D869ECEC9A308631 /* BRLOptionParser-prefix.pch */, + D44EE75E565309CBCBA8CDC8C1F148EF /* BRLOptionParser.xcconfig */, + B4CB86E9D779A444876EA5C4C68A3FBD /* BRLOptionParser-dummy.m */, + F905EE6F0E88BD8C5751FFC92BFFE94A /* BRLOptionParser-prefix.pch */, ); name = "Support Files"; path = "../Target Support Files/BRLOptionParser"; sourceTree = ""; }; + 6E2CCCE58C70E5BD024CF7CB92F938FD /* Resources */ = { + isa = PBXGroup; + children = ( + 5CC3D4BB2BA8F24225B176DDE03F8307 /* cs.lproj */, + 5B35B3E1CD06D484F53A3E476AA3686D /* de.lproj */, + 59F05446C5A1EF95AA5BF54D2E7130C0 /* en.lproj */, + 517A68D17E290C18DFC53F4AECCE8C21 /* es.lproj */, + 68B50473C6A5B2B637DC2178073B139B /* fr.lproj */, + F79B729FCFF408FC35D4D736823C9C54 /* it.lproj */, + BF25BEA59068FC2091F298B09B53F9A0 /* ja.lproj */, + 42C5B04BED868BDFDAD6B1B4CEF885F1 /* ko.lproj */, + B2929F5EBA6B563EE116F09A01CE8D7B /* nl.lproj */, + 01EE31460870DAFD92CCDA3D6C827B67 /* pl.lproj */, + 9C124E5083A1C670ECBA0CC803184E03 /* ru.lproj */, + E66FAB44C7A517141189FD000F9B5DF5 /* zh-Hans.lproj */, + 30E4F3002967D50F222222D209A56B79 /* zh-Hant.lproj */, + ); + name = Resources; + sourceTree = ""; + }; + 716AAE84A71385DD226AF96938438E03 /* RxCocoa */ = { + isa = PBXGroup; + children = ( + 8CE15615F891AE84CC28B31DD1DFED34 /* _RX.h */, + 94BAE73C588EBC604DCE573EBE4A04AB /* _RX.m */, + BD319BD2D6840013A6DB5A5E61C57FD6 /* _RXDelegateProxy.h */, + 95CD99AE9A1C290252A419DD48B2A263 /* _RXDelegateProxy.m */, + A35868FCBD5266D702CEA4A6E65DF160 /* _RXKVOObserver.h */, + 0137F5061A6992367D3A03EF05697F7C /* _RXKVOObserver.m */, + 03F1DFC052C8E6481E56E12D5099A620 /* _RXObjCRuntime.h */, + AE6FE24DA6B6C599439A0CD35E6C0C39 /* _RXObjCRuntime.m */, + 1E8515AADD6430481FAC8F2DD92FE0F8 /* Bag.swift */, + 2845A68913E943BC36DC30691EC2767F /* BehaviorRelay.swift */, + 51EC586F86D6864B74B5211875AF2253 /* BehaviorRelay+Driver.swift */, + 82B40C2141EAEBD3F4738B4EF37F735E /* Binder.swift */, + 3EB40302AC6F385C4C11271681C7BE07 /* ControlEvent.swift */, + B4E3D27538532E6FBE6335CF89442070 /* ControlEvent+Driver.swift */, + 81BA4BA48C5140576A6D93FB9EF7C2C1 /* ControlEvent+Signal.swift */, + 59CB3865143E8097440FEC7F48AF17D7 /* ControlProperty.swift */, + F998ED9B73E72761135D03EABEA4CF52 /* ControlProperty+Driver.swift */, + F8443ACD9BB292ED1C07002A2677C9A6 /* ControlTarget.swift */, + 5CC38924038209EE8DA70D12014386B4 /* DelegateProxy.swift */, + 1F9FFF0AB40ABBC9CD22047B6E5CC748 /* DelegateProxyType.swift */, + 3031DA85910A1DEDA7065204F6B9BBE1 /* Deprecated.swift */, + 7C4E2B96284BE7E91A2FAC7A35722534 /* DeprecationWarner.swift */, + B790A80F95F23886D51E59CA3075E0B7 /* DispatchQueue+Extensions.swift */, + DC9CBF3F42BE77A6A4156483F6E7A677 /* Driver.swift */, + 0F79F86B3A28700C995D5AC30EC550D6 /* Driver+Subscription.swift */, + 0BC3571EE031A7539BB287EFCD666847 /* InfiniteSequence.swift */, + 284942F9AAC3AFDD49598A09EEBAF5FE /* KVORepresentable.swift */, + BA2390463C1EED454182AA10546F90EE /* KVORepresentable+CoreGraphics.swift */, + E40D5C853F53872A9EDD51E2438864BC /* KVORepresentable+Swift.swift */, + 12628820AE714729D03F0AEE969EB3CD /* Logging.swift */, + FCAC7C3176AFDC0CD3DD5D9184E33909 /* NotificationCenter+Rx.swift */, + FB8175F2ECF55A3974C3B9F8F610B7E4 /* NSButton+Rx.swift */, + D20F25597538DF7C1290E5ECF3BA6073 /* NSControl+Rx.swift */, + 4C42E3C6553CD86CA08CB17F055E2FD1 /* NSImageView+Rx.swift */, + B3A10808A0957AA2EC5EB7D1A77E4B27 /* NSLayoutConstraint+Rx.swift */, + 0B43F76AA34F7FD88FC35F826FE0911E /* NSObject+Rx.swift */, + EFF605517B8B672280D85EF59BDBBF89 /* NSObject+Rx+KVORepresentable.swift */, + 0B4668396025D7B53E3928CAD15C1E28 /* NSObject+Rx+RawRepresentable.swift */, + 115DA97253EAAD8E69D0C8D6A825B18D /* NSSlider+Rx.swift */, + 877FB023C6C79A9CB7DD34AAFEEB6434 /* NSTextField+Rx.swift */, + 83268468D9194D59FF72E067422BC173 /* NSView+Rx.swift */, + 2761A1137851210C3B778227D6BA8376 /* Observable+Bind.swift */, + C12D136B18E0E7F8F564601A28FFF96F /* ObservableConvertibleType+Driver.swift */, + E4824FF61369273279E9C73FAE118858 /* ObservableConvertibleType+SharedSequence.swift */, + 53D3CF439796CD1B84572CBCBAAE5BA9 /* ObservableConvertibleType+Signal.swift */, + 5A5F9295B64270BDF4807BAED9FDCCF1 /* Platform.Darwin.swift */, + EC7D06D7C30521ACFE2CB8810BAD6EB4 /* Platform.Linux.swift */, + 466571AD788ED5DE02B15FD2D5AB0E3D /* PriorityQueue.swift */, + 9A04D2678FFF63F78747A96526C32525 /* PublishRelay.swift */, + B5BC8CC3D75BE1CAA9F4B2902AAF6A7F /* PublishRelay+Signal.swift */, + 1221D61D7EDFE6C6834C60D4AFAD701A /* Queue.swift */, + DE7D4EDDDDBC9A8284DF4316C7F919EB /* RecursiveLock.swift */, + 3FB4990CA1A63AF517A7F5A32C6EE3EB /* RxCocoa.h */, + 729746443824EABA89E3E1088EB4F53B /* RxCocoa.swift */, + D17DBC203AF5B8E02A628E6920BEC64B /* RxCocoaObjCRuntimeError+Extensions.swift */, + 6FF66DB8174612DE3868CD61F0C25E75 /* RxCocoaRuntime.h */, + 117E3E5CB18C4C8895AEDCB96CBFF566 /* RxTarget.swift */, + FEC68B3F3AAE886E35269B85EAAAA4A2 /* SchedulerType+SharedSequence.swift */, + A6162331FD69499451313416F088EB1C /* SectionedViewDataSourceType.swift */, + 68A72BF8AF1DC1EC8C18BFA79BE3799F /* SharedSequence.swift */, + 5FF30D62954A12098DAC3C27FB43EC7E /* SharedSequence+Operators.swift */, + C69F2408EF8B0C3BB7419872996ED01C /* SharedSequence+Operators+arity.swift */, + 1E7682153DC4B4654DC8897B52E1C68A /* Signal.swift */, + 9D3C210247CB8CE3DF722B8D487265EB /* Signal+Subscription.swift */, + B140252F1C653182982BDDFA6F4DFFEF /* TextInput.swift */, + AD54960D651138A3CA4F03327ED04C1E /* URLSession+Rx.swift */, + A78A955124EF2B235F55BC4724F30B86 /* Support Files */, + ); + path = RxCocoa; + sourceTree = ""; + }; + 785842678515C4CDC9428DD20DCD752D /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + B5020B0A649E766997C633601AD85F17 /* Pods-proxy_conf_helper */, + 93AB896DD6AD247E69959A4B8C06F5AC /* Pods-ShadowsocksX-NG */, + 07568FCBBF071BD2EE0E5EBA001A4712 /* Pods-ShadowsocksX-NGTests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, D9727D7444B8CA54728F850F99A13C9F /* Frameworks */, - 5739D868472AD947DBFB4A27A0D08D8B /* Pods */, - AEB9320F726BCC1999DC9E6198BA9F1C /* Products */, + A121E30DB2EE8A9F51DB7FF968A46B32 /* Pods */, + 57B3F389DDA7629AE17CC01B90DDFFD1 /* Products */, 785842678515C4CDC9428DD20DCD752D /* Targets Support Files */, ); sourceTree = ""; }; - 7EF95C42E180DBA569189077EF0D551B /* Support Files */ = { + 8A25A387472EAD5BB30DAAB83258C32E /* Support Files */ = { isa = PBXGroup; children = ( - B11F51D93DCFD7B0948095E201A09C71 /* Info.plist */, - 0598B496AD3E8300228BC3050091C4A0 /* MASShortcut.modulemap */, - A7DC3D31C58327F3981DA70B91FF9D28 /* MASShortcut.xcconfig */, - BC5A23A63EA04BBF65EBBC3D5905D453 /* MASShortcut-dummy.m */, - F3FE3FD846A162F26A05D064DE8B7C21 /* MASShortcut-prefix.pch */, - F552E19724BF0CC37D66E1D5DA273720 /* MASShortcut-umbrella.h */, - 7BC64B28448C32D46B71791C7752E48F /* ResourceBundle-MASShortcut-Info.plist */, + FC2C8FAFAE7C8BCB3D9CC3ED192B4B94 /* Info.plist */, + 440BA268964308AC9235A827B872F6D4 /* RxSwift.modulemap */, + BDE9D3194329F41EB9A694107DB540EE /* RxSwift.xcconfig */, + 2A10E8E2BEA43547BD31F4D396909B1C /* RxSwift-dummy.m */, + B0472FBF9DAB466EF0A53394A8D2AA12 /* RxSwift-prefix.pch */, + FBC4E57263B9AAECCE6AE5CA60FBB422 /* RxSwift-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/MASShortcut"; + path = "../Target Support Files/RxSwift"; sourceTree = ""; }; - 83CE4EB00CCF59FFD1AFFB7D1867243C /* Support Files */ = { + 8C7551BC8CC9D1DFB5418F4F38063CA9 /* Support Files */ = { isa = PBXGroup; children = ( - 5DEF0513A865FDE2BA2DB595F61C8538 /* GCDWebServer.modulemap */, - A984B4B81E65B86157898F60533E1E07 /* GCDWebServer.xcconfig */, - 44F322EFF3BACA5D7D9D859973112A90 /* GCDWebServer-dummy.m */, - A0A7422506FBD6F1F77B1F2A6D4167C1 /* GCDWebServer-prefix.pch */, - 88003809F8CD8A52B418884D95EB7FFD /* GCDWebServer-umbrella.h */, - 15DA0C069A08192F0FEB6C4FA1B9FD43 /* Info.plist */, + 30A75BA6552FED28E799BFDD7E6A7139 /* GCDWebServer.modulemap */, + AACEB0B4DCFE72B1C86FBDD44F903602 /* GCDWebServer.xcconfig */, + 549C9311455C020E76C0D8304E77DCBB /* GCDWebServer-dummy.m */, + 7643BF1BAF3D845AF3B73DC3CC809225 /* GCDWebServer-prefix.pch */, + AECA5396C8BF81522F020F67B5051752 /* GCDWebServer-umbrella.h */, + 9C77EDD882C5528391392F6395AEA3CC /* Info.plist */, ); name = "Support Files"; path = "../Target Support Files/GCDWebServer"; sourceTree = ""; }; + 929EE5F74988E63CF231F9BC489D2A1A /* MASShortcut */ = { + isa = PBXGroup; + children = ( + E66E142759BB10864774D2C94E961514 /* MASDictionaryTransformer.h */, + 56904622AEC39DA2CC3FFE7AC03DEEA7 /* MASDictionaryTransformer.m */, + 14527C0C3B63CC337E971AE1EE047A07 /* MASHotKey.h */, + 8BE1FB4F6E66271CE86F1B9F3B10C4B2 /* MASHotKey.m */, + 814650269499C22D7A00826E5401B231 /* MASKeyCodes.h */, + 9BA0976D52E0B1BE7C75718D8F34D6D7 /* MASKeyMasks.h */, + 2AB0C03C6DE868D798024FA98E343764 /* MASLocalization.h */, + 6DA5EAC6F4067B7529AE728323D52317 /* MASLocalization.m */, + 1F8A0E045BE3B86CD42FE28A50C51A3F /* MASShortcut.h */, + 94D1A921D2DDCB6ADE167A6D9F9FC69D /* MASShortcut.m */, + 3F5864100C7FDE5370D2A9D47B635CA3 /* MASShortcutBinder.h */, + 4F78B857D0E9107E4AC4BE639CB5FDB5 /* MASShortcutBinder.m */, + 7A842F5AB01E533C407EF9F939D43654 /* MASShortcutMonitor.h */, + 3725898C57B3547AF4E212E583C75CE2 /* MASShortcutMonitor.m */, + 57895F669A6A45DBE1808ECFCA7E6DE8 /* MASShortcutValidator.h */, + B9FD186DCB0C2486656EE428FDF24E95 /* MASShortcutValidator.m */, + A0BF6605792D11FF8BA02337532C154B /* MASShortcutView.h */, + 02C042C63C5C999AF2FB0BFB90543584 /* MASShortcutView.m */, + 173CDFE8FFD9A8EF4825486DCB53A7A4 /* MASShortcutView+Bindings.h */, + 8090A9366A6F313575595425BA5B7C5F /* MASShortcutView+Bindings.m */, + 3F7E8032E1CE431DD241906525558580 /* Shortcut.h */, + 6E2CCCE58C70E5BD024CF7CB92F938FD /* Resources */, + 4B6B0D327DA58988CCE4B33397397D74 /* Support Files */, + ); + path = MASShortcut; + sourceTree = ""; + }; 93AB896DD6AD247E69959A4B8C06F5AC /* Pods-ShadowsocksX-NG */ = { isa = PBXGroup; children = ( @@ -1078,60 +1315,50 @@ path = "Target Support Files/Pods-ShadowsocksX-NG"; sourceTree = ""; }; - 9701034B736920D6B75D5159F4DDF8C8 /* Support Files */ = { + 9A0360C9F0BDB0487A3F29C1C2A8224B /* BRLOptionParser */ = { isa = PBXGroup; children = ( - 87565A23AA7557C2E511616C236D8EA9 /* Alamofire.modulemap */, - 7CA89BE9B5B3A196D2B6855595514951 /* Alamofire.xcconfig */, - C163E270D8C0282204B45FA92F52546F /* Alamofire-dummy.m */, - 627D2F62F19998F945736C6D580E9326 /* Alamofire-prefix.pch */, - AC8837A9B05156CBBE4A8FECC465034F /* Alamofire-umbrella.h */, - E515CE44A5FFCE8293899BD5AF596B7A /* Info.plist */, + 9D1F46FBDCCCDDD5DD811F74DF066657 /* BRLOptionParser.h */, + 49D4DB0A334289080782A137D04524BE /* BRLOptionParser.m */, + 616C5106F0376E5EC82A41692B9F5189 /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/Alamofire"; + path = BRLOptionParser; sourceTree = ""; }; - AEB9320F726BCC1999DC9E6198BA9F1C /* Products */ = { + 9D2C9C5D9941B5038F214F9E9ADC1E05 /* GCDWebServer */ = { isa = PBXGroup; children = ( - FBAF339F33C80576683D76394CA51047 /* Alamofire.framework */, - 7B63AB91C9378BEF83982ADCC82E9770 /* GCDWebServer.framework */, - C760BAF596F45988BF95E5D3C10BA670 /* libBRLOptionParser.a */, - E0CF346DBA2C8BDB54C4D65E01BE83B4 /* libPods-proxy_conf_helper.a */, - 288F0992DFCC5E6027AA31FD385C34D6 /* MASShortcut.bundle */, - 9B6ACACC69C2EA2681770741535F1D69 /* MASShortcut.framework */, - BF541EB164C2E45EC80ADBE338F2D325 /* Pods_ShadowsocksX_NG.framework */, - D0531FFA0D5305257F668D1D12A1411F /* Pods_ShadowsocksX_NGTests.framework */, - B0FC490145F0D2AD9B833C41F78CA818 /* RxCocoa.framework */, - E15756B54614ACA75251861D700E1946 /* RxSwift.framework */, + 50D8BF310E0933E0B29656BDF88A05CF /* Core */, + 8C7551BC8CC9D1DFB5418F4F38063CA9 /* Support Files */, ); - name = Products; + path = GCDWebServer; sourceTree = ""; }; - B17E9640A1D4A8265ADA3D9996A2F88A /* Alamofire */ = { + A121E30DB2EE8A9F51DB7FF968A46B32 /* Pods */ = { isa = PBXGroup; children = ( - 3C3BD779374EECF9D6A500A90CF6279C /* AFError.swift */, - ADD97D49C025DAFE6EE85E866D134966 /* Alamofire.swift */, - CE411A2DEA5A7FCC657E6AE76503E34C /* DispatchQueue+Alamofire.swift */, - 8A0AC98004CCEB4CC8A5BECA09878CAA /* MultipartFormData.swift */, - 6C9B2D9A28ABC58CFEE373E87A4052A7 /* NetworkReachabilityManager.swift */, - 31EB405D095DCBF9C17B60786F115283 /* Notifications.swift */, - 44D9192CE046EB20FAF1BF26C3FC60FC /* ParameterEncoding.swift */, - 07BCC46A8B3A4B93914CB0C0624B3942 /* Request.swift */, - 996FFF36FA1A968D9BC5367C870F15F0 /* Response.swift */, - 2BC3FA38663D9266B6B5D834492C9F7A /* ResponseSerialization.swift */, - 20817295866FCA3DF75F20CA436D877A /* Result.swift */, - 226616D9FEC0ABA73A4365514AEE5914 /* ServerTrustPolicy.swift */, - 268E53814A4808A9CB605BFB3FEAB50F /* SessionDelegate.swift */, - 7D436A58ECC98D13B9A4C91CD460DF93 /* SessionManager.swift */, - 8395CF3A1AD4518051CE6450BDBC43BD /* TaskDelegate.swift */, - D8AAFB037FDFF7437E3006151BA5FE9B /* Timeline.swift */, - F452BDEBCDC82858ADCB26071AA4E12D /* Validation.swift */, - 9701034B736920D6B75D5159F4DDF8C8 /* Support Files */, + E24A269C6A2EF0AC968CBCCD75BB7C0A /* Alamofire */, + 9A0360C9F0BDB0487A3F29C1C2A8224B /* BRLOptionParser */, + 9D2C9C5D9941B5038F214F9E9ADC1E05 /* GCDWebServer */, + 929EE5F74988E63CF231F9BC489D2A1A /* MASShortcut */, + 716AAE84A71385DD226AF96938438E03 /* RxCocoa */, + 5B3B3628BA886BD5CC873215255A3181 /* RxSwift */, ); - path = Alamofire; + name = Pods; + sourceTree = ""; + }; + A78A955124EF2B235F55BC4724F30B86 /* Support Files */ = { + isa = PBXGroup; + children = ( + ADBBB7FC840E52C76645ADFD06C6F489 /* Info.plist */, + 3285ED8593B0D936F2A37C7D2E0BDB0D /* RxCocoa.modulemap */, + 2DD2740F8043D2CE9EA5BB7A7DBFC49D /* RxCocoa.xcconfig */, + DD070E26B8B863382F7AA226CF6D5794 /* RxCocoa-dummy.m */, + F12CA3526AFD49BC5CD55B6B6ED743C4 /* RxCocoa-prefix.pch */, + B8FB3328120B8DA4A4A0E2CA1B29F188 /* RxCocoa-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/RxCocoa"; sourceTree = ""; }; B5020B0A649E766997C633601AD85F17 /* Pods-proxy_conf_helper */ = { @@ -1149,166 +1376,38 @@ path = "Target Support Files/Pods-proxy_conf_helper"; sourceTree = ""; }; - D39D89B6092E13E49DACCE731274D097 /* RxSwift */ = { + D9727D7444B8CA54728F850F99A13C9F /* Frameworks */ = { isa = PBXGroup; children = ( - 545894F30123AB01C758C6689014BCC6 /* AddRef.swift */, - DAD59D3D739C07FCB2F892826F951063 /* Amb.swift */, - 7959286D1E30292AB76348C2712DE95B /* AnonymousDisposable.swift */, - 1510E6FAF4B06DADDD220C9F52E25600 /* AnonymousInvocable.swift */, - 09D280C7FCC6AE30E6F8430DBA380925 /* AnonymousObserver.swift */, - 61F3F1CC2095B445C811F0C16E005B49 /* AnyObserver.swift */, - E58A2330CC4D40F78DD08B5A8500F8BF /* AsMaybe.swift */, - 9B1F2B769E9F6355DF3AC956AF04D064 /* AsSingle.swift */, - B0EC4DF0E84A696168D1071B48A4F7F4 /* AsyncLock.swift */, - B6FC4FABF722AF2F518BE654AD7DCE4D /* AsyncSubject.swift */, - 75828AB7420DC80FF4A055AD665BA0E8 /* Bag.swift */, - FA95194E204F208C75DB1F2E683163B8 /* Bag+Rx.swift */, - 5F5BB1CD589B3E27B8A75FA688E70401 /* BehaviorSubject.swift */, - D3AEFA8AAF6328813FEC6D38028EF063 /* BinaryDisposable.swift */, - 534E4A964C49209EE277E82628F5710B /* BooleanDisposable.swift */, - 5D904A8BE8B963C1CFDCB978A106290A /* Buffer.swift */, - 52F0C0E792C43635C8DF0BA00874B14F /* Cancelable.swift */, - 45E0880FB45B513CD4BFD63BB3E7B736 /* Catch.swift */, - E366C7D398E704625CF7481FD8243D48 /* CombineLatest.swift */, - 3CCE02B40B95BFF261200228AF8EBC16 /* CombineLatest+arity.swift */, - 183021AC8ED6060D003674388D5B1B49 /* CombineLatest+Collection.swift */, - 878BBACC17D3136FA4DD1CD04CAD85A0 /* Completable+AndThen.swift */, - E3637E3CB5915225EA71EFF6B20D7171 /* CompositeDisposable.swift */, - 2E60ACE8054201E83089FD336ABCAA2F /* Concat.swift */, - 8C848585CA8A7F199434CE368A9DB06C /* ConcurrentDispatchQueueScheduler.swift */, - 4901C7D532E5179B742DB643CA1B408A /* ConcurrentMainScheduler.swift */, - 007948A0B78DA5B2FBD4E8DB9D2029DA /* ConnectableObservableType.swift */, - C9DE8782EF7863C69F019CB969C665C2 /* Create.swift */, - 43C50B5D873459E5F93927D1EC6F3505 /* CurrentThreadScheduler.swift */, - F8169698EDB7D60F459C13552F619848 /* Debounce.swift */, - AD0CD5DD6E42873872D2B73A60081FD0 /* Debug.swift */, - CB2D9630B47A5E202FF1CFB831ACACDE /* DefaultIfEmpty.swift */, - 37CB5F5627B0B6D64308CD1A83ABB3B0 /* Deferred.swift */, - 24A143E562F6586266DBD22F7295D5AD /* Delay.swift */, - F546C188C97659BE86FA0E06FB1674BB /* DelaySubscription.swift */, - A023097C535D0BD3D56EA8BD993D7B3F /* Dematerialize.swift */, - 9BC03B0B3ABA0DCA68E6E5743698D228 /* Deprecated.swift */, - 5CF6DC4F50F673F957821F727AF12A71 /* DispatchQueue+Extensions.swift */, - C45B38DD11A907BC6F5B45FBB0A35B0C /* DispatchQueueConfiguration.swift */, - DA02D299CE44B023D9B4909ED0B34FCC /* Disposable.swift */, - 92244CECCE7B444FAB2C8202E5EA4056 /* Disposables.swift */, - 66C68481E0A15400E90729E5B6E9C46D /* DisposeBag.swift */, - 5BE80522158C8CAE9E3CFE12B3D857F7 /* DisposeBase.swift */, - C0D57732901E7827AB4442A3185E7287 /* DistinctUntilChanged.swift */, - 68DFB337F054F8982CF31389DBFF6374 /* Do.swift */, - CAFB8EBD43A17F895E88B967D4BA489A /* ElementAt.swift */, - F0581044A5A088C077656011651C2465 /* Empty.swift */, - 41DAD2203618169F641D264D7C2EE0E6 /* Error.swift */, - 5613FC3B7810194DB766F2AA387847AF /* Errors.swift */, - CD4154ED163C40AFD6A2FCB49EE532DC /* Event.swift */, - 0FABCD0845EFCC0E95BC4EF19880A8D3 /* Filter.swift */, - 0ABFF341309F8A2E61DCB2F092DFF2CA /* Generate.swift */, - 51807E4919B34213B8F47CD576F3FC3C /* GroupBy.swift */, - A829DA85B827FD4953161E2FC29C0AB4 /* GroupedObservable.swift */, - E88567B756C3B048C0FE65824DF88BF5 /* HistoricalScheduler.swift */, - DD8C09387A31AC5BF4B190F880F4883D /* HistoricalSchedulerTimeConverter.swift */, - 2A97F155FCEA6B4942A94BBB31544107 /* ImmediateScheduler.swift */, - 292363670323CC583F50A5989CC3D9D0 /* ImmediateSchedulerType.swift */, - D82A11977CDF4CBC2948546163A27853 /* InfiniteSequence.swift */, - 38A7049C5EA5CF2C54BDD0F1BE4D6FCD /* InvocableScheduledItem.swift */, - 29DCD7692E660B9C1FF8E7A3063F2B47 /* InvocableType.swift */, - 2A2D9F47CF554F3D0FF28A201822E872 /* Just.swift */, - 7C7BE50FB7791D6009BF033B78EA631C /* Lock.swift */, - FE7CDCDB0682EC04C12DD552E4910CE5 /* LockOwnerType.swift */, - 4A9DE35FDE449CC76ADF563645C81738 /* MainScheduler.swift */, - A102F9379F5A55F3D3C85A1FB3687F97 /* Map.swift */, - 6B29EA946AE6D8BE387824C42B121D67 /* Materialize.swift */, - 2D1CCFB65C786E25702F68A5601E80DC /* Merge.swift */, - 28EC1B5940ACD0BA9FE7309429D6ED68 /* Multicast.swift */, - 326A9DBB817D95D4A5840B314BF9202B /* Never.swift */, - A6573695D6E38AB0E45298916E5927F9 /* NopDisposable.swift */, - 5AD930CE2472F57A003EF8907CA3116C /* Observable.swift */, - 636B1F25C166F05CF62D7805112E6124 /* ObservableConvertibleType.swift */, - 6F9BA2F71CB99026197CB42B356FC63E /* ObservableType.swift */, - A923BB8E574DFADCE6DFF91F708E5886 /* ObservableType+Extensions.swift */, - 02C96012B347BB2E33A987A213CA57C4 /* ObserveOn.swift */, - 52A9C2646B9718959021371687EE6250 /* ObserverBase.swift */, - 20E5746A4CCE940BCE91535C0D37FEB2 /* ObserverType.swift */, - 0A0BEC4717A975478F52AD458ACA42AA /* OperationQueueScheduler.swift */, - 4FD63BE80EB7AD180525F89009471D6D /* Optional.swift */, - 6ADE820F11CABD3D1C1218580FD439A2 /* Platform.Darwin.swift */, - 6078A9FA6BBA43845BFA8D0BA163E903 /* Platform.Linux.swift */, - 6873049F56F58D5ED3E44719FC73C4F6 /* PrimitiveSequence.swift */, - B57622ECC64CA3D7C8ADDDEA14B176F5 /* PrimitiveSequence+Zip+arity.swift */, - 6BBA11BAC502FBD57943042D6D9D8975 /* PriorityQueue.swift */, - C6E4C64CF7155899BC2A74A24FB7513F /* Producer.swift */, - B4D3408600A2042F4070CA97A67C60D5 /* PublishSubject.swift */, - BC25AF2EB8052CF4B0A98541C78FA86C /* Queue.swift */, - B23C70F218FD3D53D1E083383A8C8225 /* Range.swift */, - BDE1BDB4BDD14E3E8B8C3F8ED3B3C53A /* Reactive.swift */, - AF7187DD22E17C86AB22B3969936E90C /* RecursiveLock.swift */, - E6B7FB2F3741600EA98ED059FA99D203 /* RecursiveScheduler.swift */, - D4632B46CC78EF8030FEB67D2D7C92DE /* Reduce.swift */, - A4DAA5324C3F0718C4CC7852CBAC50D0 /* RefCountDisposable.swift */, - 7F37E66B5A8F3C680354C935F2744C29 /* Repeat.swift */, - E2946829864608D127EB046EF8BAA69D /* ReplaySubject.swift */, - 2B264AC163CEFA27D7ED08507B018B11 /* RetryWhen.swift */, - E3EFB1E8AA462C2C937015579F139C13 /* Rx.swift */, - 5548D8C229700A0AEB23E7B56630426B /* RxMutableBox.swift */, - 3E4A6E1ABB2E00314CDA799343BF5983 /* Sample.swift */, - 023DBF06ED50965F68CFB72972CC89AB /* Scan.swift */, - 9E95ABF737E8C0AF728AE99576593651 /* ScheduledDisposable.swift */, - 58AB02263E99467FF2175C1702B5ED82 /* ScheduledItem.swift */, - 63D2A88D8F95FB962BFE6279B46169D6 /* ScheduledItemType.swift */, - 5DB38C96718DD2622736537BB2ECC6C2 /* SchedulerServices+Emulation.swift */, - AEF8F1346C831D7B8A9AB960E3B768C0 /* SchedulerType.swift */, - 20192591D331E03B112CEAB1C32D1FCF /* Sequence.swift */, - 5CBA0B69E87685AC3D2B60EF632158AE /* SerialDispatchQueueScheduler.swift */, - 82D5F30FE87A96D7AA09249DB4D8F82F /* SerialDisposable.swift */, - 57B9A9B823D866CFD5C18A2DF4FBB883 /* ShareReplayScope.swift */, - B2EA7252711AF3E4D70DD2035DA71438 /* SingleAssignmentDisposable.swift */, - 6B348F108925962F83EAEAC0E334CA06 /* SingleAsync.swift */, - E1C50ACDF517D102DEC7195257ADFE7B /* Sink.swift */, - 0C6BFE2E2D5A6B7A594B788F625561EF /* Skip.swift */, - 2487CFFD3F6BA7CF97A97003B1727B18 /* SkipUntil.swift */, - 646E91BE14388979C352F573B4362A39 /* SkipWhile.swift */, - 30A4AEAD1EF447DFE90F59D1059C79B7 /* StartWith.swift */, - 09C5D99ED4F07DAF3A50F59C765CA416 /* String+Rx.swift */, - 15DDA519B43F0EB8DFD887D2F7A6FA8A /* SubjectType.swift */, - 761DD04D13CF5C96E3661EBB41496409 /* SubscribeOn.swift */, - DCF0DD57FB4E2DED2BA043D232A8F3E9 /* SubscriptionDisposable.swift */, - 65BABB33CC0139D359C0ECABD05CD0B7 /* Switch.swift */, - B4C0501500E132C7E97A97A425E68D90 /* SwitchIfEmpty.swift */, - 5CCFC9D5177E577E082A70923B848393 /* SynchronizedDisposeType.swift */, - A25F673AD7CCCE0189ADEB549EB5F618 /* SynchronizedOnType.swift */, - 09C5253CFC07A13DD0519ACE57BC0EC0 /* SynchronizedSubscribeType.swift */, - 68041DC65BD6DADAF82378F8875B3FCB /* SynchronizedUnsubscribeType.swift */, - 9B7FB3B8F0F547E0CCC3EDB3FA5509E5 /* TailRecursiveSink.swift */, - 13E44E93931EFF87E67F113CD862A0C1 /* Take.swift */, - 23DD34EFE94FB8C8DCE00EE72C2473BF /* TakeLast.swift */, - 359132E97DDCA64E851B2CE3FE71F813 /* TakeUntil.swift */, - 3D97535E8704070D353435086265E041 /* TakeWhile.swift */, - B16B0EBC2B5BA4309D9844CDE1932B26 /* Throttle.swift */, - 000B7BC80F254E06ADEC25B19B7C2C37 /* Timeout.swift */, - F2B901654D7B257777782F6F00162843 /* Timer.swift */, - 5CA271EB6661517D11AE48621699B565 /* ToArray.swift */, - B1AA3C8E05F2C2D813D16D20D9984553 /* Using.swift */, - 924ECD8580145EBC5702BD6D3B314F61 /* Variable.swift */, - C8C4EEF5D5723B94ADD7BCE012A2C6E7 /* VirtualTimeConverterType.swift */, - 752306794D721D2E1BF157AAA32771ED /* VirtualTimeScheduler.swift */, - E969B8C71DA98B913BC86FD4AC5574BD /* Window.swift */, - 524C8DBC63D366E5C0E8A5EA62713031 /* WithLatestFrom.swift */, - 628F693AA128B618F45155C70C6E1024 /* Zip.swift */, - 55FEBC89F2833AD13021CF63D4B810E1 /* Zip+arity.swift */, - EB6C8C0D1FA8537542033F55E1556F6C /* Zip+Collection.swift */, - 6F4F4AB09FF3EB5CF87F58B472407041 /* Support Files */, + B792280B7BC7CA44B5D7090C8F732A0D /* RxSwift.framework */, + E2E3EA611324A191E7D403B061C56915 /* OS X */, ); - path = RxSwift; + name = Frameworks; sourceTree = ""; }; - D9727D7444B8CA54728F850F99A13C9F /* Frameworks */ = { + E24A269C6A2EF0AC968CBCCD75BB7C0A /* Alamofire */ = { isa = PBXGroup; children = ( - B792280B7BC7CA44B5D7090C8F732A0D /* RxSwift.framework */, - E2E3EA611324A191E7D403B061C56915 /* OS X */, + 822A32C67318B2171827F9F276472026 /* AFError.swift */, + 11C843F0A8CC61D5B0B5CCFFC9B6EE77 /* Alamofire.swift */, + 420BCA1748F9506534FB0A233C6EB49A /* DispatchQueue+Alamofire.swift */, + 970A1485E6688625754970DC8BBC7072 /* MultipartFormData.swift */, + 8F59435F621E888DE7C2D34F05907491 /* NetworkReachabilityManager.swift */, + 1325C66E30F87E4F665AF154722DABD6 /* Notifications.swift */, + 5C658B994B5D0A61D71450AAF4863AC8 /* ParameterEncoding.swift */, + F58912C1C682D706B91088B2E3E28849 /* Request.swift */, + 874D86BD8C4CCD8EC1708994A7C75D5A /* Response.swift */, + 1E17FA1477E37C745A33298D5655B877 /* ResponseSerialization.swift */, + 4B9730D65B8F0B8AE3F7A91E58EB6705 /* Result.swift */, + F41F3F896039E0F2EE235A159F853B08 /* ServerTrustPolicy.swift */, + E39B6AE9C7DBAF6F7102DDE428C6D4DA /* SessionDelegate.swift */, + 0DD3EF9C6F47C3257FC0151069723CD1 /* SessionManager.swift */, + 18D47804A6E897EF20B93DDAE8450B08 /* TaskDelegate.swift */, + 219ED455E5F4B8EBAC276EB23D845469 /* Timeline.swift */, + EEF0E141DA73C02E3495E9BC4F3BCB79 /* Validation.swift */, + 3F41528D8527E7927A277FE059F9FC77 /* Support Files */, ); - name = Frameworks; + path = Alamofire; sourceTree = ""; }; E2E3EA611324A191E7D403B061C56915 /* OS X */ = { @@ -1322,69 +1421,6 @@ name = "OS X"; sourceTree = ""; }; - ECCA55967A058AAF061006AC31FD7B9D /* BRLOptionParser */ = { - isa = PBXGroup; - children = ( - 1C85AD27621E054B8D7328ABDCB9697D /* BRLOptionParser.h */, - 78481FCBF09A8942C2BCB258298EBDBE /* BRLOptionParser.m */, - 790B69D60BC48E76772183AD8030677E /* Support Files */, - ); - path = BRLOptionParser; - sourceTree = ""; - }; - F2148EAFEC18D957377DC614F758C944 /* MASShortcut */ = { - isa = PBXGroup; - children = ( - 3E29C34C13007B34D5420BE9284FDCB0 /* MASDictionaryTransformer.h */, - 8C49546F441EF6B013C11F9ECC4E494E /* MASDictionaryTransformer.m */, - 55279FD33E1F40398E20D7299953F40A /* MASHotKey.h */, - 0CD9E0BB93F28FD91CBF8872501B7280 /* MASHotKey.m */, - 77903B50BE4AEAB8D9679B1978D574DF /* MASKeyCodes.h */, - B2093E2378DE5EC41D64F8387561BF3B /* MASKeyMasks.h */, - 5089235C3188BE2DE716A15C48207E8A /* MASLocalization.h */, - E1E128ED33CF5ECBE9E08D07D4B7672D /* MASLocalization.m */, - F4E647FF308219F6F10EF468CFD459D1 /* MASShortcut.h */, - 535DA0E1B20533E30B48C0F04AEF67CD /* MASShortcut.m */, - FF9B0B9971EBD4F210054B63F172C41E /* MASShortcutBinder.h */, - 98882780F0AB1693529D79FBB62760CE /* MASShortcutBinder.m */, - 55178DF04DDB4E9CA87135167C286E60 /* MASShortcutMonitor.h */, - A0A5B4E433F12A0EE14939299BFA30B5 /* MASShortcutMonitor.m */, - E5C53D1D9FD46ACD15E6C5381BD7A754 /* MASShortcutValidator.h */, - 9FAE9397A18DDA64A11847EF6BA0476C /* MASShortcutValidator.m */, - A077B4E84F0E05629C70075B9B9D871E /* MASShortcutView.h */, - 687C69F6237AA7E984907EBAB8FA2B02 /* MASShortcutView.m */, - 01A59C606077EB80665FFDDD235664B3 /* MASShortcutView+Bindings.h */, - C8E1C61760F4B2BFEC652B9A01D4F846 /* MASShortcutView+Bindings.m */, - 68FC88BF39528F8F3D69BD6D8964B5A7 /* Shortcut.h */, - 4F38A79FE026B54D13A4ADE87802BA23 /* Resources */, - 7EF95C42E180DBA569189077EF0D551B /* Support Files */, - ); - path = MASShortcut; - sourceTree = ""; - }; - FAE79CDC2C7965FFEF8DC80E6B817A6B /* Support Files */ = { - isa = PBXGroup; - children = ( - B3F32502ED756288E4F37152D996A3FA /* Info.plist */, - 4019945AEEA809599FA5E80EB71F757D /* RxCocoa.modulemap */, - 3F3B4679D9E78EFD2FF88087203A48C6 /* RxCocoa.xcconfig */, - 321FFBA726A46A7C54E164E625D44DED /* RxCocoa-dummy.m */, - B72677785827D5383DD7933263E069B1 /* RxCocoa-prefix.pch */, - 99EEC612B008B452C8ACD615123EDA93 /* RxCocoa-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/RxCocoa"; - sourceTree = ""; - }; - FD9B6873D4081C5CCEF69576498728B2 /* GCDWebServer */ = { - isa = PBXGroup; - children = ( - 00A280D4C78AFD320A4205C6BF2884BE /* Core */, - 83CE4EB00CCF59FFD1AFFB7D1867243C /* Support Files */, - ); - path = GCDWebServer; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -1481,7 +1517,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 9B622302DDDA1881AC9ABA9EA4C81564 /* BRLOptionParser.h in Headers */, + 7A88AD6D91DEB45F24205AB36E456007 /* BRLOptionParser.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1504,7 +1540,7 @@ ); name = MASShortcut; productName = MASShortcut; - productReference = 9B6ACACC69C2EA2681770741535F1D69 /* MASShortcut.framework */; + productReference = E417BF107A54D2027FCFA21115B0B6BF /* MASShortcut.framework */; productType = "com.apple.product-type.framework"; }; 05800FAF969AA3CD7F8AEB1C36988B53 /* Pods-proxy_conf_helper */ = { @@ -1521,7 +1557,7 @@ ); name = "Pods-proxy_conf_helper"; productName = "Pods-proxy_conf_helper"; - productReference = E0CF346DBA2C8BDB54C4D65E01BE83B4 /* libPods-proxy_conf_helper.a */; + productReference = EFB5583E95D9163093E1C43B391FFCC1 /* libPods-proxy_conf_helper.a */; productType = "com.apple.product-type.library.static"; }; 339CC546E4A1696296EFEDC2FA79ADE0 /* Pods-ShadowsocksX-NGTests */ = { @@ -1538,7 +1574,7 @@ ); name = "Pods-ShadowsocksX-NGTests"; productName = "Pods-ShadowsocksX-NGTests"; - productReference = D0531FFA0D5305257F668D1D12A1411F /* Pods_ShadowsocksX_NGTests.framework */; + productReference = 9D966DC3E49AE0BCCC9A1CA03C275F22 /* Pods_ShadowsocksX_NGTests.framework */; productType = "com.apple.product-type.framework"; }; 3CB2B8006B2B1ACAF9ADCA1DC82E2290 /* BRLOptionParser */ = { @@ -1555,14 +1591,14 @@ ); name = BRLOptionParser; productName = BRLOptionParser; - productReference = C760BAF596F45988BF95E5D3C10BA670 /* libBRLOptionParser.a */; + productReference = 63F95A3FB354F1B43BC3C7CCA7C48037 /* libBRLOptionParser.a */; productType = "com.apple.product-type.library.static"; }; 50DA2BB85DEBA27DDBB9E2D53E8E2A1A /* RxCocoa */ = { isa = PBXNativeTarget; buildConfigurationList = D913F5C08F647E9FCC34C3A5B3030BD5 /* Build configuration list for PBXNativeTarget "RxCocoa" */; buildPhases = ( - BFA83558D5EAD45E880E89BCA3CA66B3 /* Sources */, + 599911CCEC78C34ADF97D68041012691 /* Sources */, AC6EF4DCF3427EDD23A06A9ACE60D1CB /* Frameworks */, 8D0544708D493A52C828804099AE01DC /* Headers */, ); @@ -1573,7 +1609,7 @@ ); name = RxCocoa; productName = RxCocoa; - productReference = B0FC490145F0D2AD9B833C41F78CA818 /* RxCocoa.framework */; + productReference = D18E7218EA86B1A581D12090718F1F3C /* RxCocoa.framework */; productType = "com.apple.product-type.framework"; }; 5B8B0ED1046111D92895FC95F12DBC10 /* GCDWebServer */ = { @@ -1590,7 +1626,7 @@ ); name = GCDWebServer; productName = GCDWebServer; - productReference = 7B63AB91C9378BEF83982ADCC82E9770 /* GCDWebServer.framework */; + productReference = B3193AEA5372872BA57804AA2CAE1875 /* GCDWebServer.framework */; productType = "com.apple.product-type.framework"; }; 88D587684BF4E7ECC675C83B7E824D75 /* Pods-ShadowsocksX-NG */ = { @@ -1612,7 +1648,7 @@ ); name = "Pods-ShadowsocksX-NG"; productName = "Pods-ShadowsocksX-NG"; - productReference = BF541EB164C2E45EC80ADBE338F2D325 /* Pods_ShadowsocksX_NG.framework */; + productReference = C8FA0250F8F58859A42FACB6244CB83C /* Pods_ShadowsocksX_NG.framework */; productType = "com.apple.product-type.framework"; }; 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */ = { @@ -1629,14 +1665,14 @@ ); name = Alamofire; productName = Alamofire; - productReference = FBAF339F33C80576683D76394CA51047 /* Alamofire.framework */; + productReference = A6FA4BF27FB90B714947E536885E37C1 /* Alamofire.framework */; productType = "com.apple.product-type.framework"; }; 9759FFB1455B05FE96A5765890590110 /* RxSwift */ = { isa = PBXNativeTarget; buildConfigurationList = C3C04E339BA1928DBC29CEFD07DC6ADF /* Build configuration list for PBXNativeTarget "RxSwift" */; buildPhases = ( - D0CF4D1BE6AFAE220B3DC5CCA6988D1C /* Sources */, + CB73BD32F4C74B161BA96C32EA4C8206 /* Sources */, 656F921478BE483858A20165B6945F4A /* Frameworks */, 515CC0B658FC2F28D886B75DF18D212D /* Headers */, ); @@ -1646,7 +1682,7 @@ ); name = RxSwift; productName = RxSwift; - productReference = E15756B54614ACA75251861D700E1946 /* RxSwift.framework */; + productReference = 60D7A87958991203E6AEEF88F8165CB1 /* RxSwift.framework */; productType = "com.apple.product-type.framework"; }; D6E5ED8DAF7CA937C8F68F342C48B26E /* MASShortcut-MASShortcut */ = { @@ -1663,7 +1699,7 @@ ); name = "MASShortcut-MASShortcut"; productName = "MASShortcut-MASShortcut"; - productReference = 288F0992DFCC5E6027AA31FD385C34D6 /* MASShortcut.bundle */; + productReference = 711B62B6A01799BBCBA4F90D70C6AF28 /* MASShortcut.bundle */; productType = "com.apple.product-type.bundle"; }; /* End PBXNativeTarget section */ @@ -1673,7 +1709,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0700; + LastUpgradeCheck = 0930; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; @@ -1683,7 +1719,7 @@ en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = AEB9320F726BCC1999DC9E6198BA9F1C /* Products */; + productRefGroup = 57B3F389DDA7629AE17CC01B90DDFFD1 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( @@ -1726,7 +1762,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - F8815ECB42FCF09BBC99D3730DFD577C /* MASShortcut.bundle in Resources */, + 4818C1BB29E7C2BF255D9941737665EA /* MASShortcut.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1784,6 +1820,74 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 599911CCEC78C34ADF97D68041012691 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7DE11B1BFD40161461B75775ACEA53D4 /* _RX.m in Sources */, + 897F13577AAA8382269EC194094D0916 /* _RXDelegateProxy.m in Sources */, + FDACBD92C66F0C5D0F33FD059BCB35FD /* _RXKVOObserver.m in Sources */, + C7E42F03821DCAD169FB9E5C2663C873 /* _RXObjCRuntime.m in Sources */, + EA4470F28E55838D29E625ED1F2EDCA5 /* Bag.swift in Sources */, + B09D2E9A8525D7217DA1233D0D3D3163 /* BehaviorRelay+Driver.swift in Sources */, + 363B6BA64ABF7E326581E60BF57E9E73 /* BehaviorRelay.swift in Sources */, + 0FFB5E639F74E4ADCEA6B4691231D788 /* Binder.swift in Sources */, + 9046C1C876045990B2EA13AAC3595F3A /* ControlEvent+Driver.swift in Sources */, + 774A0ED04EAE9326B4CE4E588A87C32E /* ControlEvent+Signal.swift in Sources */, + E00B7623181A63716524D50FB52AF9EF /* ControlEvent.swift in Sources */, + 16C4E1D2700082128AEFB0A56E339123 /* ControlProperty+Driver.swift in Sources */, + 9B428D0BA1F182F5113B861921972176 /* ControlProperty.swift in Sources */, + 7E7F8834C1CEC6FC91F47FD16545AC6B /* ControlTarget.swift in Sources */, + F9E086C2872C233495E02147B2EB4115 /* DelegateProxy.swift in Sources */, + B2D921758B432E5510A4916377700E9C /* DelegateProxyType.swift in Sources */, + BF4EBAA751C53BA5462FF75957BF1A89 /* Deprecated.swift in Sources */, + 83E17A8F8042821DBFE379B8E721D9D3 /* DeprecationWarner.swift in Sources */, + FCE8C2F9D08C36D48A6423761DEF3072 /* DispatchQueue+Extensions.swift in Sources */, + 6B26270D538BBE32EC979CE071CC218D /* Driver+Subscription.swift in Sources */, + 58D21664187909739FA5E11A5AC1EB04 /* Driver.swift in Sources */, + 54D6EC90DA6336155F9A83D7F630E4EC /* InfiniteSequence.swift in Sources */, + 1306B351B70FAEA38005826E3E0B7F3A /* KVORepresentable+CoreGraphics.swift in Sources */, + A47881E900B27D5C9E6201B96C6F9B40 /* KVORepresentable+Swift.swift in Sources */, + 04C0394D629A610FA6BE32906A9772C5 /* KVORepresentable.swift in Sources */, + 4165379A8A38766F01C8DCA38C1636EF /* Logging.swift in Sources */, + D491E71A28D78BC00368C3F5EFA16EF6 /* NotificationCenter+Rx.swift in Sources */, + C4BF841C95A8E72CC6FF74F77BD92F0C /* NSButton+Rx.swift in Sources */, + 2A1DB4D085BAA9578B77458893659DDC /* NSControl+Rx.swift in Sources */, + 7487316C5EAAC9C271C7B797E99D3D22 /* NSImageView+Rx.swift in Sources */, + 5CC209128C782B168EEBF07741EA406C /* NSLayoutConstraint+Rx.swift in Sources */, + D5AD134F7DB2BF3A1ADEAED307320E0F /* NSObject+Rx+KVORepresentable.swift in Sources */, + D14843F20202C1CD6FC26520F816EC1E /* NSObject+Rx+RawRepresentable.swift in Sources */, + 63BE27B8249C72EC539F4F5367E9DCF5 /* NSObject+Rx.swift in Sources */, + 3B89F320811AC31E66E7B14CDF9046CB /* NSSlider+Rx.swift in Sources */, + C48FFAB1DDCF9FDEE249D169DD3AB317 /* NSTextField+Rx.swift in Sources */, + 2D0D484C1ED547F456B759214405D595 /* NSView+Rx.swift in Sources */, + 89B177904145220E5B578A6EFEE5D5A2 /* Observable+Bind.swift in Sources */, + 305A214BC25347F3EF3994A5DE5C5F25 /* ObservableConvertibleType+Driver.swift in Sources */, + 623781D4B229E4D819BF3997A2F6F954 /* ObservableConvertibleType+SharedSequence.swift in Sources */, + B6D7EC205EBE545C0FFC283C99959B88 /* ObservableConvertibleType+Signal.swift in Sources */, + AEA4F5986FE7926A033E0AF86F931282 /* Platform.Darwin.swift in Sources */, + 4708A1DA6FBEAAC23B4535D8770289E3 /* Platform.Linux.swift in Sources */, + C35E5A2FB5AF7879770EA0DFF62DDB8F /* PriorityQueue.swift in Sources */, + 8949803FBCD4E3F9D862412EC64C1B2A /* PublishRelay+Signal.swift in Sources */, + 1F60D3DB469D63B9ACB07A1C8C322879 /* PublishRelay.swift in Sources */, + 7BB8ED49DD0593318DBAB158D154AEC4 /* Queue.swift in Sources */, + 0A80FDAE7915EE476A38C9CCC68FAC69 /* RecursiveLock.swift in Sources */, + 7B42E31B60FD9B8235C6AE41B32931B2 /* RxCocoa-dummy.m in Sources */, + B2E47D0CDCC58CD8D3193EAD385B3D54 /* RxCocoa.swift in Sources */, + A903683F7163C5A9A7E5C592A1E46803 /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */, + 8240214BBCE95C6957ED5D6DC5D97550 /* RxTarget.swift in Sources */, + 4021AF3A4FAF79BB86F80005B72627BE /* SchedulerType+SharedSequence.swift in Sources */, + E5A9C51D2B5CBE025C396CDEB5900BA2 /* SectionedViewDataSourceType.swift in Sources */, + 92BA6B417A495F5740EE5C3C35CC86A6 /* SharedSequence+Operators+arity.swift in Sources */, + A4DCFC022D92D0731971797EFFEE46DC /* SharedSequence+Operators.swift in Sources */, + C3E79028E8D9C078CCC8F7B5F6B63624 /* SharedSequence.swift in Sources */, + 6A7F23D172685A59F7890947DE5B288A /* Signal+Subscription.swift in Sources */, + 572B991A35A12B7D033F2DC67451FC0B /* Signal.swift in Sources */, + 45E690B4908CA6A5E5903A62C51B4813 /* TextInput.swift in Sources */, + FDF45F406FE3B124880C5ABD4FC68FF5 /* URLSession+Rx.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 81F40976E91E102E115D6BE30CCC18E9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1829,66 +1933,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - BFA83558D5EAD45E880E89BCA3CA66B3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 122FFB4B36FA3F74072A453832F84ECE /* _RX.m in Sources */, - 3D693429A31AF334FE584D395D7E6133 /* _RXDelegateProxy.m in Sources */, - BA4E2E5784DFEA8CD5D09039B9B465A6 /* _RXKVOObserver.m in Sources */, - F9A083E8499E3D6FD016386EFF9077F1 /* _RXObjCRuntime.m in Sources */, - 601F21CBA959E531A349EB3E52FE995E /* Bag.swift in Sources */, - 355E3D24221C05473338AA2B0E9E613C /* ControlEvent+Driver.swift in Sources */, - 70B0A108A1AA2498B53B6247AB6B85F3 /* ControlEvent.swift in Sources */, - 7214838BF73F3401200344955729C789 /* ControlProperty+Driver.swift in Sources */, - 2ADDAE50C265B5025D0B1F9764BBD3AC /* ControlProperty.swift in Sources */, - E3D6E1B68331D777282FD8CEAA4F3625 /* ControlTarget.swift in Sources */, - 5639004CE97536B6FEA6EB60E83DE411 /* DelegateProxy.swift in Sources */, - F8F408461A74E2DD1C2F52EB5CE75DBC /* DelegateProxyType.swift in Sources */, - FCE19FE31F220BF73A655705230D794B /* Deprecated.swift in Sources */, - 4075D8C048D42B2CC057C53323F3F462 /* DispatchQueue+Extensions.swift in Sources */, - F3C6B978DDBCC0E699D26D119B572EAE /* Driver+Subscription.swift in Sources */, - 1D644164F050145109BA5D7BEE9614B4 /* Driver.swift in Sources */, - 7A5C24DD8864E48E6D43B8B98B594ADA /* InfiniteSequence.swift in Sources */, - D81001368F100460264962569F099802 /* KVORepresentable+CoreGraphics.swift in Sources */, - 61D1DF6515813E069AA2191EDA369286 /* KVORepresentable+Swift.swift in Sources */, - BB5641E2D7D16938833681670A55667A /* KVORepresentable.swift in Sources */, - 4F17B41C7A5D3F2A07AB16B08CECD9B7 /* Logging.swift in Sources */, - 879141B5825E41A5704D637BAFDD29AA /* NotificationCenter+Rx.swift in Sources */, - B25F18CA3C510C41288D907933124619 /* NSButton+Rx.swift in Sources */, - 1BE62ECDA4B3A8B13C8B78ACC98795E5 /* NSControl+Rx.swift in Sources */, - 86D3DBB91C4ABB6920ADB46B5E158E26 /* NSImageView+Rx.swift in Sources */, - B0D6D07A3329617011E4220080E157C0 /* NSLayoutConstraint+Rx.swift in Sources */, - 378839FF60B0284A71199E89C842E921 /* NSObject+Rx+KVORepresentable.swift in Sources */, - 85924B29E50F5745628090826F2D064F /* NSObject+Rx+RawRepresentable.swift in Sources */, - 6832ADBC0198335F7B502C7DA1F0ED98 /* NSObject+Rx.swift in Sources */, - D7681A76A0F47EEB17E16A5D28BD125D /* NSSlider+Rx.swift in Sources */, - 8552027632E115D6DAD1099C38090EAA /* NSTextField+Rx.swift in Sources */, - 53C65F51E7A47A1B14E324AF29A41AEF /* NSView+Rx.swift in Sources */, - 36CD88E2D2099581BC19D42048D158B2 /* Observable+Bind.swift in Sources */, - 911BEA57E7620828E28399C3CEC8C5B2 /* ObservableConvertibleType+Driver.swift in Sources */, - 21378D436C90D7B4D65D820281D159EA /* ObservableConvertibleType+SharedSequence.swift in Sources */, - 8F015FD16EE1580601B4856E795196FE /* Platform.Darwin.swift in Sources */, - A197AB07449327D4540308FF01BC3C54 /* Platform.Linux.swift in Sources */, - 92F332AD156F10CF4364BBDAD493FB29 /* PriorityQueue.swift in Sources */, - 61E61C4B8FD7BA59062CBE45764790E9 /* Queue.swift in Sources */, - 9709A18386118371F2831A6080BE1400 /* RecursiveLock.swift in Sources */, - C9C6EDFC3305BB433A24F269C643AEFF /* RxCocoa-dummy.m in Sources */, - EB58AE5225AEEA217C860F6D6E558E20 /* RxCocoa.swift in Sources */, - ACF6603E2EC6E8B13AC63123161CD195 /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */, - 96A523A42595CFE0374C023A683B3753 /* RxTarget.swift in Sources */, - E034B9A4E3D86C8D49371909C2D49480 /* SectionedViewDataSourceType.swift in Sources */, - 51750A5B573347F29ECB252FD6F7B809 /* SharedSequence+Operators+arity.swift in Sources */, - 944C284C7390180088035BBE864823D0 /* SharedSequence+Operators.swift in Sources */, - 2708274C4337FB152E46FE16728C8704 /* SharedSequence.swift in Sources */, - DA1B86D493CD8111AFC476D0EEDD498A /* TextInput.swift in Sources */, - 7E4448CEDD753074D00755C6C8F71F0E /* UIBindingObserver.swift in Sources */, - F705D537791FF5B259AC2BED6619F784 /* URLSession+Rx.swift in Sources */, - EE8586A641E4CB0201D2563B1EEA6C41 /* Variable+Driver.swift in Sources */, - BA510AF8040C827F56166B707BE76626 /* Variable+SharedSequence.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; C85081056E3DF73EFBB147D8F01CDE65 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1896,156 +1940,160 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - D0CF4D1BE6AFAE220B3DC5CCA6988D1C /* Sources */ = { + CB73BD32F4C74B161BA96C32EA4C8206 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3D31990DAC7D206A8CED0E166967345E /* AddRef.swift in Sources */, - 52FC9AD6D1323BBDE4D458D780833850 /* Amb.swift in Sources */, - FF59638AD925FD4B1E22F7CB3B404881 /* AnonymousDisposable.swift in Sources */, - 2BC4A1BBB3CF1E3736359EAC2557EBA1 /* AnonymousInvocable.swift in Sources */, - CA811C461085BCD75D8B606661C2AD73 /* AnonymousObserver.swift in Sources */, - 1824713806488E78A33A48AA7BE85A2C /* AnyObserver.swift in Sources */, - AF134CF20F447E0E0DAC073D73C7F86A /* AsMaybe.swift in Sources */, - 237C447BF6FCA534AB4A2F91BA2731E5 /* AsSingle.swift in Sources */, - A7FAD159116F1DBA5CD6E7B990C9A303 /* AsyncLock.swift in Sources */, - 61C12CE6D79EB6A96AF17AABAFEDCBDC /* AsyncSubject.swift in Sources */, - 799FF40352661DDA83AC794E9C604783 /* Bag+Rx.swift in Sources */, - 9FA23568E21FB2B69B69DE816F0D8015 /* Bag.swift in Sources */, - 3614DA072E285FBA231AAE506DD00722 /* BehaviorSubject.swift in Sources */, - 6B0F3785D9AE93550ADA347C926ADB1D /* BinaryDisposable.swift in Sources */, - 00D5F4580CB36DEEDCD9993C7AB12FC6 /* BooleanDisposable.swift in Sources */, - 437FA9F525690A3F247B254130EA26C8 /* Buffer.swift in Sources */, - AA3DEE3C7E1A806E5946C2BC01893808 /* Cancelable.swift in Sources */, - 12AAA6C1CF57638AE521DCE56BED0135 /* Catch.swift in Sources */, - 8B61FFE12CF61FE5504472C344A1ED1A /* CombineLatest+arity.swift in Sources */, - 10B733D4847215A070C8DA610FEB341A /* CombineLatest+Collection.swift in Sources */, - 1F1B7F5EA399508BB5091B36C1C95671 /* CombineLatest.swift in Sources */, - 264617822F4D99335F47F6AFF80253BF /* Completable+AndThen.swift in Sources */, - 58FD6898891A4D0E7D0E32043FB71976 /* CompositeDisposable.swift in Sources */, - 823CA45387E1BBB3CB7D29B91B7FA1A2 /* Concat.swift in Sources */, - 977A3E71BC55F13D5D4D924BBA878872 /* ConcurrentDispatchQueueScheduler.swift in Sources */, - 6EB4C5113BBA1A69F56A6BC63B6E62D3 /* ConcurrentMainScheduler.swift in Sources */, - F0B96041A73DA23E9D262BA15C170D01 /* ConnectableObservableType.swift in Sources */, - E630F719F45F55F60395139F462151E2 /* Create.swift in Sources */, - EEAC0241CA98FB00547A1FD43393919F /* CurrentThreadScheduler.swift in Sources */, - 3D56193C6790214CE39FA76DDD3CF8D2 /* Debounce.swift in Sources */, - F312C5B4C0D22FF4F993AF7F797EE199 /* Debug.swift in Sources */, - 4DC0FAD6E6A6615179C8AA7C5E2862F7 /* DefaultIfEmpty.swift in Sources */, - 9BCCF2D457FCA3F9A7688DC599FD32F1 /* Deferred.swift in Sources */, - 688BFF2000657BAADD192CA92249705A /* Delay.swift in Sources */, - 42A2F56A949ADB27CDF4ACEF31A84EB7 /* DelaySubscription.swift in Sources */, - DE68B3E9BA04A5DEA59697E2828E90A8 /* Dematerialize.swift in Sources */, - F2FD100BE6F84972590D979D42ED4FC4 /* Deprecated.swift in Sources */, - DCE20142AF8D357B7CCEBBE021148310 /* DispatchQueue+Extensions.swift in Sources */, - F9A0498BD9162FE8DB33FEC0C34799B2 /* DispatchQueueConfiguration.swift in Sources */, - 3E535F38140F4E1ECFB098340836F763 /* Disposable.swift in Sources */, - BA465CDF798AEFDE90A8C0CAAA1B1098 /* Disposables.swift in Sources */, - 97D7D5D14D02DDB584E54BA9878242AC /* DisposeBag.swift in Sources */, - 7390ED4DE06437338430EB83AF3BD56C /* DisposeBase.swift in Sources */, - FBA9A81E2370D564461112665A0C3B6A /* DistinctUntilChanged.swift in Sources */, - 8BA67E4A4F689245492734AEAA8D6529 /* Do.swift in Sources */, - 3C808C81AACAA8641399DA9AA95C0F71 /* ElementAt.swift in Sources */, - 5E38136ECF2487CEB1671D6D231E3F5F /* Empty.swift in Sources */, - B8580D2CE60303378BFD4FBA2C6F23A7 /* Error.swift in Sources */, - 4CF21399A46B77C62FF0342B6719FCCC /* Errors.swift in Sources */, - 6979DCB69E7266EC39F06DDB6D7D1EF1 /* Event.swift in Sources */, - 59FA89429C44FFFC10AE0FED40033C74 /* Filter.swift in Sources */, - 4A08159FBFDD0D49A7E097D1A6D8ED1C /* Generate.swift in Sources */, - CE270F335D051643A45CCD09FD203831 /* GroupBy.swift in Sources */, - 74A825BD416A174CCCC55B0824EF2E05 /* GroupedObservable.swift in Sources */, - 2A2F65DFD1EE779D4F51A48FFD66C197 /* HistoricalScheduler.swift in Sources */, - D7B87735E689DBF9F8CA42227B8E6B88 /* HistoricalSchedulerTimeConverter.swift in Sources */, - BCB03A46BA9CA1A4D1A7539B2D6E5E1E /* ImmediateScheduler.swift in Sources */, - A8BA41C1262C1E9B84D4F744E00AF0E5 /* ImmediateSchedulerType.swift in Sources */, - F5C76B37D1C8E6738569F7AA3D40F916 /* InfiniteSequence.swift in Sources */, - 0E647DAEE0FA9B09AB44F2FC7F783AF6 /* InvocableScheduledItem.swift in Sources */, - 41F5717673BC090472587250F4A7BDFF /* InvocableType.swift in Sources */, - 1C12866E3E74BE6F0513E46B48ECE1D7 /* Just.swift in Sources */, - 8B66C13BF2C26F4C8E16368CC951B78A /* Lock.swift in Sources */, - CCEDF6CBEF930200FC7775BA39573BD6 /* LockOwnerType.swift in Sources */, - 28B9D3AD37C41CA2B5B954BC3F2A4CD2 /* MainScheduler.swift in Sources */, - CD66165D619F2CFA447BB599817305F1 /* Map.swift in Sources */, - 3867C0C197045398134BE70D72B7A1EA /* Materialize.swift in Sources */, - 0EEDED92446E48374613587144395686 /* Merge.swift in Sources */, - 334670C40333B0360D97D38097EB5A8C /* Multicast.swift in Sources */, - A1F4FEACF258A06986DEFA39C9FC32C4 /* Never.swift in Sources */, - 92E02A303BB54BDFAED85930F2EC67A1 /* NopDisposable.swift in Sources */, - 974D6C91F4DAF42C50352A2B1FD5BA36 /* Observable.swift in Sources */, - 380B25054F2B7FCFE08A5228DA847BAB /* ObservableConvertibleType.swift in Sources */, - 659014230849E812C6185A976081B37C /* ObservableType+Extensions.swift in Sources */, - BCEDD2079F8697D75351BD8880AB5F5E /* ObservableType.swift in Sources */, - 0831DDBAFF287B622A0E7BF2F07067EC /* ObserveOn.swift in Sources */, - A6E3B7DAEEAC86F5517E5B10349EF854 /* ObserverBase.swift in Sources */, - 260C370245B63D4004DADF4D24E3BD00 /* ObserverType.swift in Sources */, - 300708DF4452315A732C36A381100EF6 /* OperationQueueScheduler.swift in Sources */, - F1409EACFA70BFBB14D0661A2A64A086 /* Optional.swift in Sources */, - 5E167DB5B613ACD8F7823C48F73EBDB5 /* Platform.Darwin.swift in Sources */, - 6C5CC1496F30D2247B546F3867DFD342 /* Platform.Linux.swift in Sources */, - 6AA46000C79ED789B70D7B35743D5AD5 /* PrimitiveSequence+Zip+arity.swift in Sources */, - 087BC98FF9D82DC970EFDBEC0EB2F630 /* PrimitiveSequence.swift in Sources */, - 599AEBFAB1C1C451709CC28400BA7460 /* PriorityQueue.swift in Sources */, - 24DE12FB296FE104885D22B0F0D73E5C /* Producer.swift in Sources */, - ED04D176C26F6B4DEE23810B8B7119B0 /* PublishSubject.swift in Sources */, - C1E7BF810B8A08D68980DEF88FB818AC /* Queue.swift in Sources */, - E93BDF607D1A682D01B2DDBC0E99859A /* Range.swift in Sources */, - FAAEF6075FA56D6420B259CB55DE44CD /* Reactive.swift in Sources */, - D98FC1E3FC63DFDC89218E02603C0531 /* RecursiveLock.swift in Sources */, - BB397F55B0307FEDE4828D0092658075 /* RecursiveScheduler.swift in Sources */, - 0C2489F5F28E8C78A5C0F2ACC9417BB8 /* Reduce.swift in Sources */, - FA47B9CD9D97967860D670B13698860B /* RefCountDisposable.swift in Sources */, - C364D9BE7F85D4001B8E8F1C6EF4B1CA /* Repeat.swift in Sources */, - DD44780BE73F9964BC370A525CC14E25 /* ReplaySubject.swift in Sources */, - CA01E0AE4F5FE45BB3AA2E55D99816F6 /* RetryWhen.swift in Sources */, - 221FE7E633BA09E8BF6B4B2FB9470EED /* Rx.swift in Sources */, - D568BE9017C4ABC2EBC93B55568FA818 /* RxMutableBox.swift in Sources */, - 02AF6FE5E8DEE90F98111F7EA2A3C4E0 /* RxSwift-dummy.m in Sources */, - 8BA0EF598E6008B8E127F20CD5871EA8 /* Sample.swift in Sources */, - E5055E923CCD18C703DD0464379D5075 /* Scan.swift in Sources */, - FEB827276214371B67B303805489B87A /* ScheduledDisposable.swift in Sources */, - 15D984826F02EEAFBC745BD8AA44630A /* ScheduledItem.swift in Sources */, - 9487C01FE68F38908090961512AA41CE /* ScheduledItemType.swift in Sources */, - 685F29779740C956045776AE4D4E8365 /* SchedulerServices+Emulation.swift in Sources */, - 2D5E4C0C7C41AFECCAFFA9121A346A3B /* SchedulerType.swift in Sources */, - 43CA37C05E91E1511246D5A99ED30AA5 /* Sequence.swift in Sources */, - D6E2F0BAD0C15F29CBEA69E2A6B78DA2 /* SerialDispatchQueueScheduler.swift in Sources */, - 07CC568506C88350F3D06C8D5E01FBE3 /* SerialDisposable.swift in Sources */, - A63F9CB6A170CE00FBD441E79DCCEE49 /* ShareReplayScope.swift in Sources */, - C47548C9A021ACE578E56C5825C7049F /* SingleAssignmentDisposable.swift in Sources */, - 0093F7D38FC7D85465CC3D99E967DEBD /* SingleAsync.swift in Sources */, - A68383D073B808A27671BDECBC6A670F /* Sink.swift in Sources */, - 548EB267AD5A7FD7AC26FAAD9C2DA7AE /* Skip.swift in Sources */, - C672608508D0E7C39889E96D744F48A0 /* SkipUntil.swift in Sources */, - DA3CF2B75F35BF67169C4A938A21526A /* SkipWhile.swift in Sources */, - E925A3CA1CEE77BDCB0CE04E46FA9EB8 /* StartWith.swift in Sources */, - D504CD5DE30A8ECF7B12BAD77637E8C5 /* String+Rx.swift in Sources */, - C24B87BB347D484FE80D05B81B7BA225 /* SubjectType.swift in Sources */, - 4D634321FD0AC2411D399AF0CD21D19B /* SubscribeOn.swift in Sources */, - 1053278298D8F300576B4D665571E9AE /* SubscriptionDisposable.swift in Sources */, - 30DF48D3434CB214CB0A8DC882B57CE8 /* Switch.swift in Sources */, - 8BCC39E8753AAD1634783813630FC556 /* SwitchIfEmpty.swift in Sources */, - 99E95AAEC050D49A770629AA6B398C6D /* SynchronizedDisposeType.swift in Sources */, - 576947974CE51E704014B05BD610775C /* SynchronizedOnType.swift in Sources */, - 079EF148723928859C047C3138DE0803 /* SynchronizedSubscribeType.swift in Sources */, - 28F9B941634C8440F300448D8F5802A2 /* SynchronizedUnsubscribeType.swift in Sources */, - 31FFC304499832DF396AEBD4FE47FD41 /* TailRecursiveSink.swift in Sources */, - 034E2CE53A5F556A85666E0818BF3717 /* Take.swift in Sources */, - 81E3BA0A338814CAD1C95B57433B36B3 /* TakeLast.swift in Sources */, - 224087BC52D59C54611FDC38839F2D33 /* TakeUntil.swift in Sources */, - 7D2E2372D60114EADF213080223E23D5 /* TakeWhile.swift in Sources */, - 1F3245B199B67151AD148F2697312170 /* Throttle.swift in Sources */, - E8C85C07DF36B6274953F0D8C3BD0771 /* Timeout.swift in Sources */, - A295CF7A971C3F7D7E80AF27D4CEEB3E /* Timer.swift in Sources */, - E15C2441B7387415553D7A7C0BEEFF87 /* ToArray.swift in Sources */, - 382B5A192325665D099B202F758D765C /* Using.swift in Sources */, - 267EA57772E03E12F78E25D3AF60616F /* Variable.swift in Sources */, - 7F1D21D9C2B4DF301EF96533DF2A1FBE /* VirtualTimeConverterType.swift in Sources */, - 327528E493914C52BB5D9C6588E46619 /* VirtualTimeScheduler.swift in Sources */, - 1406A68843A0616DE9575C7F1B318023 /* Window.swift in Sources */, - ADEA4A10E5631586E27024F5D6478641 /* WithLatestFrom.swift in Sources */, - 7C4028F18BB20A49E0C8E8DC7C07765F /* Zip+arity.swift in Sources */, - 930C2D40D19017E7D8FFA0543F0DB97B /* Zip+Collection.swift in Sources */, - 66A31FDD5EFC2321BC1A3AE5D97C0D36 /* Zip.swift in Sources */, + 4A4408FFA76EAF3E6C82888069FA74BA /* AddRef.swift in Sources */, + F25EB58E105AFB65A62E5B4D670EC3A4 /* Amb.swift in Sources */, + 0C8240D6CEBBEEA043891D3FC5B6583D /* AnonymousDisposable.swift in Sources */, + 7AD32C4A8B13DDEFF05DCF521E89B9E5 /* AnonymousObserver.swift in Sources */, + 80F39A93408F43D4234F807D51686664 /* AnyObserver.swift in Sources */, + C3DE1F5F412BB52D0D46E179A69B0D58 /* AsMaybe.swift in Sources */, + E9BA2F04B8242EBC70AD366755DDE682 /* AsSingle.swift in Sources */, + 6C70E6D376363F78D7BEA000B5A1C309 /* AsyncLock.swift in Sources */, + 113A11F61DC88927204A3B8024EEDEE5 /* AsyncSubject.swift in Sources */, + D486060C6A0F9300A1680DC208841BE8 /* Bag+Rx.swift in Sources */, + C05242C7AD45BFA7D14EEA269E8F77F8 /* Bag.swift in Sources */, + 5E04C336772C75B4BD3DE0FDC9D7F082 /* BehaviorSubject.swift in Sources */, + 5AB4432DDFDFFBAF30B04131BEA65884 /* BinaryDisposable.swift in Sources */, + 6303F577E7E204EDD3290341645A3C93 /* BooleanDisposable.swift in Sources */, + 17BD24642744FE2260FA6811B165388B /* Buffer.swift in Sources */, + 8635269F248F424E4EECB84EAA5025FA /* Cancelable.swift in Sources */, + 8F6CC2B52C9EDF0C6F87877E25AB523E /* Catch.swift in Sources */, + AF9067B9CDA7BD3E92AB740E2B4D4313 /* CombineLatest+arity.swift in Sources */, + D047C60851BFC9D2C493A36A4EF177E6 /* CombineLatest+Collection.swift in Sources */, + E0FF2B53C79DE29F557295CD66849772 /* CombineLatest.swift in Sources */, + A8DBD1857EC662A08D54BBA95E42E2D5 /* Completable+AndThen.swift in Sources */, + 4EA7780B43C03F302BC16E613600AEE6 /* Completable.swift in Sources */, + F765730BADD93DCC345E2DE56E6C62CA /* CompositeDisposable.swift in Sources */, + 6252C2B00AFB3FC879D405191C4F8A4C /* Concat.swift in Sources */, + 6A64206CD6836AC8FEF84C6156CD8BEA /* ConcurrentDispatchQueueScheduler.swift in Sources */, + 71E974A4435358B0B1B371FFA5EF58C7 /* ConcurrentMainScheduler.swift in Sources */, + 42B758DEB73A71CFEE6AB0091A4D51FA /* ConnectableObservableType.swift in Sources */, + F03E764DDC08BFFE403CDE649961A182 /* Create.swift in Sources */, + B6B64BA6DF509EBBCDDA2E3D0FFD15BF /* CurrentThreadScheduler.swift in Sources */, + 91C0EF4EEBFE321C2F441FA4F4C11B10 /* Debounce.swift in Sources */, + F4E2663E1F8C4822B9F1CB7DF2D20D49 /* Debug.swift in Sources */, + D9C652378242BAE39E7190AB1479615D /* DefaultIfEmpty.swift in Sources */, + 62B5F416D74F8147F7DF9151B9CB0A96 /* Deferred.swift in Sources */, + B9C213FE3345C49943F292D94145CBC2 /* Delay.swift in Sources */, + 09A6B67CF6F6BDAF375261535340DD3A /* DelaySubscription.swift in Sources */, + 06E53ABF634928697CF55B2D6DD415F4 /* Dematerialize.swift in Sources */, + FB6F90016D5931C84A6C6246AA8FC589 /* Deprecated.swift in Sources */, + 7B4C3C45E92DB455C98680E229867CE9 /* DeprecationWarner.swift in Sources */, + B5C5B8AD50BA9EF13CF2FCC39D233BEA /* DispatchQueue+Extensions.swift in Sources */, + 4B011F87C4CD25363F21DEF2C9581B25 /* DispatchQueueConfiguration.swift in Sources */, + 317DE7777E93EDA37B798E4778E8AF24 /* Disposable.swift in Sources */, + 0B24DF0C1B8DFEC4738DE16AE0467553 /* Disposables.swift in Sources */, + 0FFA1CFFE797C9500D68689C5D9AE025 /* DisposeBag.swift in Sources */, + 277E1C593CBC2FC2935E8377ADCB4F9D /* DisposeBase.swift in Sources */, + 6135396E25194755B2FCFC03C62263B3 /* DistinctUntilChanged.swift in Sources */, + B64418D3CA2AEEF18D0EC5AD9331418F /* Do.swift in Sources */, + 88FBCBFFE4425441DC4AED87182340F3 /* ElementAt.swift in Sources */, + 820C8506D425B8392259E83BAD962B3E /* Empty.swift in Sources */, + BF9A718095FF8B6D50B86CE5E49D2806 /* Enumerated.swift in Sources */, + 420D4C0DA53B332CDDAA294AE3E7B740 /* Error.swift in Sources */, + 1FC45BAE1645E857B19EBB05E0CBA244 /* Errors.swift in Sources */, + 203CA8CA9FC10517AD691B4CD2D35B40 /* Event.swift in Sources */, + 46BF838ED5099DE5FF962D68D79D2349 /* Filter.swift in Sources */, + 2DC07EB6B16990A067D1D053382C1573 /* First.swift in Sources */, + 2184836F18B35AAF94E8BE8B40206F15 /* Generate.swift in Sources */, + 027E63B83CAF0C92F57B9AB56674EB04 /* GroupBy.swift in Sources */, + 490B8F69828862C7939BE0F47D6DB89C /* GroupedObservable.swift in Sources */, + 05EFEC2BDEDBF30BF56C3F2DB0AE7A56 /* HistoricalScheduler.swift in Sources */, + 984CFED13106FED5980C072A6BE6A8ED /* HistoricalSchedulerTimeConverter.swift in Sources */, + E4C1BCACA652B5F16936BD89A8C8F298 /* ImmediateSchedulerType.swift in Sources */, + 775A47C2CC9C252F6F612BC52258D549 /* InfiniteSequence.swift in Sources */, + CE3433577AC6A3A699828941BED494AD /* InvocableScheduledItem.swift in Sources */, + 1D51BDA7275CF818A0072751DE5EF399 /* InvocableType.swift in Sources */, + A984AE396834F1EF8C1063A1B658151C /* Just.swift in Sources */, + 37F45802E36DFB8D332DE998347FC8EB /* Lock.swift in Sources */, + B8B5444B935D4EB27FB9043B91B7051E /* LockOwnerType.swift in Sources */, + E25A92CC625C9F817B6E30D8BA3FA362 /* MainScheduler.swift in Sources */, + FF48776622396EC0C1D7776DF09781EE /* Map.swift in Sources */, + 3C507AB95BF1F4AC2F692FE5CADA9CB2 /* Materialize.swift in Sources */, + CE72C87BA2E459F034007E66425F212A /* Maybe.swift in Sources */, + 6854825AC3848196270B428A36FBB043 /* Merge.swift in Sources */, + 7DCF1C20B4759A0D61B023AAEE75BAA1 /* Multicast.swift in Sources */, + AE4469ABED69AF5CCDA9F79F39CEC4D9 /* Never.swift in Sources */, + FDD7A9BACD4F983FAF4443179C5DD53E /* NopDisposable.swift in Sources */, + B253253B456FF86F30E0295D61253313 /* Observable.swift in Sources */, + 350B80BF6F26209C3BD76F4FD3E93E3F /* ObservableConvertibleType.swift in Sources */, + DEB685D908D2D7D908A292A761456A8F /* ObservableType+Extensions.swift in Sources */, + 612281D2096564D60D241186DCAE5706 /* ObservableType+PrimitiveSequence.swift in Sources */, + B7645B89B4EA9E40E73FE8453A104EEB /* ObservableType.swift in Sources */, + 7F7AD0AEE5FEC490EAC6DA63559A6E3C /* ObserveOn.swift in Sources */, + 7F9313D68927235417B8703B0B4FC5E0 /* ObserverBase.swift in Sources */, + D4A99917EBD151044BFA8E751E1250E7 /* ObserverType.swift in Sources */, + 7866C369C49972E30DD646C16447C682 /* OperationQueueScheduler.swift in Sources */, + 32F59423331F13E53E93207A23CAB81A /* Optional.swift in Sources */, + 83311F362776862EBDE3EA84F204F11D /* Platform.Darwin.swift in Sources */, + 141D65E8D754B3CD6053D152E60EBCC7 /* Platform.Linux.swift in Sources */, + FC370E0DDDC82C67228A592097A39548 /* PrimitiveSequence+Zip+arity.swift in Sources */, + 2BB6D185FB842C820E5EAC08FDB3A19F /* PrimitiveSequence.swift in Sources */, + 12498A71D7F9769F2686E137BEE742A4 /* PriorityQueue.swift in Sources */, + 720E93B2FE64C66DC3CFA6088DD40A2E /* Producer.swift in Sources */, + BA323A31F89C4B1236C98E5E097BE573 /* PublishSubject.swift in Sources */, + 4540E2CEAA8B2C8A52C60707F64C9952 /* Queue.swift in Sources */, + 8738EB95B710731B66BECC5468B235C1 /* Range.swift in Sources */, + A305AF2A15236E49B1F690DB9E8DEDB3 /* Reactive.swift in Sources */, + B9ABFFC64C4C6D69E54B241E66628A05 /* RecursiveLock.swift in Sources */, + 2942BED5614FBEF4C6D07C7B9C746F1F /* RecursiveScheduler.swift in Sources */, + AC7D8A725626167C483F03B8BDBACF4E /* Reduce.swift in Sources */, + A27AE5C98C89D359EF8B6E8A6A0C805E /* RefCountDisposable.swift in Sources */, + FCD2C753E6D8C65EBDC798994D1CC902 /* Repeat.swift in Sources */, + 87DF52BA9D6A9A8A28DA38395FD6E52A /* ReplaySubject.swift in Sources */, + 67D8ED58AD2C8315F19FB3F7DD968893 /* RetryWhen.swift in Sources */, + F3C91131A98744C6A84091DEBE562A83 /* Rx.swift in Sources */, + DDE3C9634B3BA4568D8BD96898046373 /* RxMutableBox.swift in Sources */, + A141E74893719F61806F5D6F6BF78A5C /* RxSwift-dummy.m in Sources */, + 6C97654D360B43FE6AF6582D4E27FB55 /* Sample.swift in Sources */, + 0616475CEB33DAF817FA5A06022D5D7B /* Scan.swift in Sources */, + F00844DA1200A12EE14C14E23E2BC859 /* ScheduledDisposable.swift in Sources */, + 80C368BB52E090970B402E0BA9D8B088 /* ScheduledItem.swift in Sources */, + 891AF67A55755172995A43569453491A /* ScheduledItemType.swift in Sources */, + C5ACAD7575831DEE4FF98E4372CF0BEF /* SchedulerServices+Emulation.swift in Sources */, + 41FD1695AFDC553E66D35A26AB0E14E0 /* SchedulerType.swift in Sources */, + 4E7600A3BA0F81B1973B887E025DF056 /* Sequence.swift in Sources */, + AC297FE8A2A32B699310FD27F624C8C9 /* SerialDispatchQueueScheduler.swift in Sources */, + 640BB2DA5629DF979311584E6F4AC09B /* SerialDisposable.swift in Sources */, + 7C74AC76B4D748648227C86121B08243 /* ShareReplayScope.swift in Sources */, + 2356019614669E69E722D77C43A90A07 /* Single.swift in Sources */, + 31DE016EE6C90B9498B1F08BC34CDC9B /* SingleAssignmentDisposable.swift in Sources */, + DD8CC605B5F5ADD0C2AE422ACCC55F1C /* SingleAsync.swift in Sources */, + C6B65F4F3D935F320EB1186D15FCD725 /* Sink.swift in Sources */, + F333C550B300576B6D1872CEBF2DCA56 /* Skip.swift in Sources */, + 7D9AEF684D4E202E7D4D08DB26362A63 /* SkipUntil.swift in Sources */, + 33A3CD60ECC4477B864CD8463A4179C0 /* SkipWhile.swift in Sources */, + 0C68821E6FFBD9B3D36F863B392E9D1E /* StartWith.swift in Sources */, + A66B49B60C9D0471B8E41130A01C1807 /* String+Rx.swift in Sources */, + A03ADA7F9A7D390E62A9367B65B29D95 /* SubjectType.swift in Sources */, + 010E5C9355217455596792A83A1A86AD /* SubscribeOn.swift in Sources */, + D80D125190DBE2395B2038A0E58CE8B1 /* SubscriptionDisposable.swift in Sources */, + 532068C53B54FD7232B59B5DB2D9EF77 /* SwiftSupport.swift in Sources */, + B5B98C960E1620AF04F5EB54A6F94060 /* Switch.swift in Sources */, + 67257E0D79F725528DFE2B3DCC0293D5 /* SwitchIfEmpty.swift in Sources */, + 3D22B1CDCC3977BC8CF2B71D3645386B /* SynchronizedDisposeType.swift in Sources */, + 80D8BB858F559DD7483D2488BF11E820 /* SynchronizedOnType.swift in Sources */, + 0CD517FAACCA346523AC5681E5451D4A /* SynchronizedUnsubscribeType.swift in Sources */, + 2F9F38633F6ED088810B32CD54529D84 /* TailRecursiveSink.swift in Sources */, + 172294F530504F23FBD67243FC416996 /* Take.swift in Sources */, + 70D7281997BAECEADCC60D9DEDCE4FC3 /* TakeLast.swift in Sources */, + A7873C6DF1BF7D59F9412A098EFE1D7B /* TakeUntil.swift in Sources */, + 4101FFED5C58EEB5FFF2F58ACDE18AD9 /* TakeWhile.swift in Sources */, + 500E908BCC57EF5E1F7F918B9876CE23 /* Throttle.swift in Sources */, + DD0FAF2DB130AB4B3459135864A9A8AC /* Timeout.swift in Sources */, + 0E5DDCC45FFD8714E2DCB955C83D4130 /* Timer.swift in Sources */, + 1C68805E7E2B3594CB435A185A6C7A6B /* ToArray.swift in Sources */, + DE92C75444AC6056D4B04914CCE93EF9 /* Using.swift in Sources */, + 23A86C508AE8C5C1615208352A05ABC4 /* VirtualTimeConverterType.swift in Sources */, + 73D927F9EA3335CEB0C45239F31A9A79 /* VirtualTimeScheduler.swift in Sources */, + E1D2EC0D3A8E1454CA8723F3DB19BEDD /* Window.swift in Sources */, + 3A9F650F4A2FC5D727FF281AAC625171 /* WithLatestFrom.swift in Sources */, + D698FD4BE7CDC647AF0875009AEF8F75 /* Zip+arity.swift in Sources */, + F233490E2120C2D6637CB3F6F8737F5A /* Zip+Collection.swift in Sources */, + 8ACEEFF8AA92153C984BCD3E6FEEFDD1 /* Zip.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2103,31 +2151,27 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 09AC259EF48E4803CFA133821B50928D /* Release */ = { + 014D6135D20B2A831876728B582DD866 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F67191B1F87DA238C4D87250DFBE43DD /* Pods-ShadowsocksX-NGTests.release.xcconfig */; + baseConfigurationReference = 9BA2A0099476E08B6CC8026BDF0C603E /* Pods-ShadowsocksX-NGTests.debug.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -2138,138 +2182,62 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; - }; - 2A0A67E0E8A2EA509035561EE4AFB8EB /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A5055B8EFFFBEDE50909E935D4BCA446 /* Pods-proxy_conf_helper.release.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - EXECUTABLE_PREFIX = lib; - GCC_NO_COMMON_BLOCKS = YES; - MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SKIP_INSTALL = YES; - }; - name = Release; + name = Debug; }; - 46A3C7E91154C2330969A66B9480072A /* Debug */ = { + 0A9023DCD8653BA4D6E580B803AAB761 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A7DC3D31C58327F3981DA70B91FF9D28 /* MASShortcut.xcconfig */; + baseConfigurationReference = 4CE700501A5FBA06F359007666C43958 /* Alamofire.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MASShortcut/MASShortcut-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/MASShortcut/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.6; - MODULEMAP_FILE = "Target Support Files/MASShortcut/MASShortcut.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = MASShortcut; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + PRODUCT_NAME = Alamofire; SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; - }; - 4768537DA1BF950E679ED85F03C11F37 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; - 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_OBJC_ROOT_CLASS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - 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; - MACOSX_DEPLOYMENT_TARGET = 10.11; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - VALIDATE_PRODUCT = YES; - }; name = Release; }; - 4B824F36959F7509C6EADD5D7C0BBF70 /* Release */ = { + 157463F8BA9AC88622CED9BD197CFDBD /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A7DC3D31C58327F3981DA70B91FF9D28 /* MASShortcut.xcconfig */; + baseConfigurationReference = AACEB0B4DCFE72B1C86FBDD44F903602 /* GCDWebServer.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MASShortcut/MASShortcut-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/MASShortcut/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/GCDWebServer/GCDWebServer-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GCDWebServer/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.6; - MODULEMAP_FILE = "Target Support Files/MASShortcut/MASShortcut.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = MASShortcut; + MACOSX_DEPLOYMENT_TARGET = 10.7; + MODULEMAP_FILE = "Target Support Files/GCDWebServer/GCDWebServer.modulemap"; + PRODUCT_NAME = GCDWebServer; SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -2279,258 +2247,198 @@ }; name = Release; }; - 4C8680BBF2C4646A883AEB692C45DD0D /* Debug */ = { + 172C3A07261D84F0894DEDBF9913ECB2 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 159548EDEA83A8DE85452C6B8DEB4043 /* RxSwift.xcconfig */; + baseConfigurationReference = BDE9D3194329F41EB9A694107DB540EE /* RxSwift.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; GCC_PREFIX_HEADER = "Target Support Files/RxSwift/RxSwift-prefix.pch"; INFOPLIST_FILE = "Target Support Files/RxSwift/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.10; MODULEMAP_FILE = "Target Support Files/RxSwift/RxSwift.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = RxSwift; SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 4EE6FA9CE312F9796EF2038BF1B9BC03 /* Debug */ = { + 312ACE5D8CB6F9064A5725F7C4CF9B12 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7CA89BE9B5B3A196D2B6855595514951 /* Alamofire.xcconfig */; + baseConfigurationReference = EF8570C25461953B9B13A259DDC88592 /* MASShortcut.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Alamofire; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MASShortcut"; + INFOPLIST_FILE = "Target Support Files/MASShortcut/ResourceBundle-MASShortcut-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + MACOSX_DEPLOYMENT_TARGET = 10.6; + PRODUCT_NAME = MASShortcut; SDKROOT = macosx; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; + WRAPPER_EXTENSION = bundle; }; name = Debug; }; - 7AECFCD77D8667B289BE7C6B62D614A5 /* Release */ = { + 353215786D69646983337802C8F2A8A3 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7CA89BE9B5B3A196D2B6855595514951 /* Alamofire.xcconfig */; + baseConfigurationReference = D44EE75E565309CBCBA8CDC8C1F148EF /* BRLOptionParser.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Alamofire; + EXECUTABLE_PREFIX = lib; + GCC_PREFIX_HEADER = "Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PUBLIC_HEADERS_FOLDER_PATH = ""; SDKROOT = macosx; - SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; }; - name = Release; - }; - 7F85541659A067CF326B2DF15039555D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A7DC3D31C58327F3981DA70B91FF9D28 /* MASShortcut.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MASShortcut"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/MASShortcut/ResourceBundle-MASShortcut-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - MACOSX_DEPLOYMENT_TARGET = 10.6; - PRODUCT_NAME = MASShortcut; - SDKROOT = macosx; - SKIP_INSTALL = YES; - WRAPPER_EXTENSION = bundle; - }; - name = Release; + name = Debug; }; - 87B437463CE3AEA04B9E52EC25693B5B /* Debug */ = { + 38AFE42E0B6F59BF0F8C611B2315CE8A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 054C3E84057CD06DB85D99E7AD207F48 /* Pods-proxy_conf_helper.debug.xcconfig */; + baseConfigurationReference = A5055B8EFFFBEDE50909E935D4BCA446 /* Pods-proxy_conf_helper.release.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; EXECUTABLE_PREFIX = lib; - GCC_NO_COMMON_BLOCKS = YES; MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - 8A32AE3640D5D14C935BD041CF0BD1B3 /* Release */ = { + 3918C3731F97F7B1A6B91CA53EA9B086 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 089EB7E66F64D3A19BB7681AFCE91031 /* Pods-ShadowsocksX-NG.release.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; + 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_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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_VERSION = A; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; + 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; MACOSX_DEPLOYMENT_TARGET = 10.11; - MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ShadowsocksX_NG; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SYMROOT = "${SRCROOT}/../build"; }; - name = Release; + name = Debug; }; - A874781789BD2BC39A2EEBE7AA84D7D7 /* Release */ = { + 3E4FE876BE3FE23B968D72994E45F33E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 159548EDEA83A8DE85452C6B8DEB4043 /* RxSwift.xcconfig */; + baseConfigurationReference = D44EE75E565309CBCBA8CDC8C1F148EF /* BRLOptionParser.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/RxSwift/RxSwift-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/RxSwift/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MODULEMAP_FILE = "Target Support Files/RxSwift/RxSwift.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = RxSwift; + EXECUTABLE_PREFIX = lib; + GCC_PREFIX_HEADER = "Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PUBLIC_HEADERS_FOLDER_PATH = ""; SDKROOT = macosx; - SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; }; name = Release; }; - ADE16BF5D9415B20062C86CEE527EAD8 /* Release */ = { + 517CFD2BFFC625AF59D3081574562C7C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A984B4B81E65B86157898F60533E1E07 /* GCDWebServer.xcconfig */; + baseConfigurationReference = AACEB0B4DCFE72B1C86FBDD44F903602 /* GCDWebServer.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; GCC_PREFIX_HEADER = "Target Support Files/GCDWebServer/GCDWebServer-prefix.pch"; INFOPLIST_FILE = "Target Support Files/GCDWebServer/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.7; MODULEMAP_FILE = "Target Support Files/GCDWebServer/GCDWebServer.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = GCDWebServer; SDKROOT = macosx; SKIP_INSTALL = YES; @@ -2539,74 +2447,83 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - B1C5C16388542F2BCF0FA9DE3F656346 /* Debug */ = { + 52B3502E90247836A684BCE55D949DFB /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 98522BF2EB25C0255284080F9CA3E195 /* Pods-ShadowsocksX-NG.debug.xcconfig */; + baseConfigurationReference = 054C3E84057CD06DB85D99E7AD207F48 /* Pods-proxy_conf_helper.debug.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + EXECUTABLE_PREFIX = lib; + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 585970A6B2E97B1118A2E7870AE18684 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F67191B1F87DA238C4D87250DFBE43DD /* Pods-ShadowsocksX-NGTests.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; - MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; + MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ShadowsocksX_NG; + PRODUCT_NAME = Pods_ShadowsocksX_NGTests; SDKROOT = macosx; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - C47912F2809D7A6562A6FB5F738EA705 /* Debug */ = { + 602E11CAE6E17BD0FB30DD5EE3E0E88A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A984B4B81E65B86157898F60533E1E07 /* GCDWebServer.xcconfig */; + baseConfigurationReference = EF8570C25461953B9B13A259DDC88592 /* MASShortcut.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/GCDWebServer/GCDWebServer-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/GCDWebServer/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/MASShortcut/MASShortcut-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MASShortcut/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.7; - MODULEMAP_FILE = "Target Support Files/GCDWebServer/GCDWebServer.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = GCDWebServer; + MACOSX_DEPLOYMENT_TARGET = 10.6; + MODULEMAP_FILE = "Target Support Files/MASShortcut/MASShortcut.modulemap"; + PRODUCT_NAME = MASShortcut; SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -2614,232 +2531,308 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - C76696C6EF5FBA0EAD947FF559CA3ADF /* Debug */ = { + 6560A4AFF004D1420AB4047ED7B3E45A /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + 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_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; + 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_OBJC_ROOT_CLASS = 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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGNING_REQUIRED = NO; COPY_PHASE_STRIP = NO; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; + 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_DEBUG=1", - "DEBUG=1", + "POD_CONFIGURATION_RELEASE=1", "$(inherited)", ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.11; - ONLY_ACTIVE_ARCH = YES; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_COMPILATION_MODE = wholemodule; SYMROOT = "${SRCROOT}/../build"; }; - name = Debug; + name = Release; }; - CBD587DEE79227D0D9EAEE32BD70E73A /* Release */ = { + 7DDA088AC519B45C54DE31DD7B6A497F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3F3B4679D9E78EFD2FF88087203A48C6 /* RxCocoa.xcconfig */; + baseConfigurationReference = EF8570C25461953B9B13A259DDC88592 /* MASShortcut.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MASShortcut"; + INFOPLIST_FILE = "Target Support Files/MASShortcut/ResourceBundle-MASShortcut-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + MACOSX_DEPLOYMENT_TARGET = 10.6; + PRODUCT_NAME = MASShortcut; + SDKROOT = macosx; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 7E6BB39B8757E394B68675AD8FE6EFB3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2DD2740F8043D2CE9EA5BB7A7DBFC49D /* RxCocoa.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; GCC_PREFIX_HEADER = "Target Support Files/RxCocoa/RxCocoa-prefix.pch"; INFOPLIST_FILE = "Target Support Files/RxCocoa/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.10; MODULEMAP_FILE = "Target Support Files/RxCocoa/RxCocoa.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = RxCocoa; SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - D13D4430BCE0A99C4D768DB5B9EAFAB4 /* Debug */ = { + 84C19B554DB00F35C8105BC241A1C0E9 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9BA2A0099476E08B6CC8026BDF0C603E /* Pods-ShadowsocksX-NGTests.debug.xcconfig */; + baseConfigurationReference = 089EB7E66F64D3A19BB7681AFCE91031 /* Pods-ShadowsocksX-NG.release.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MACOSX_DEPLOYMENT_TARGET = 10.11; - MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; + MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ShadowsocksX_NGTests; + PRODUCT_NAME = Pods_ShadowsocksX_NG; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + AB22803FF442FDA32B9017FBF80DF1A8 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EF8570C25461953B9B13A259DDC88592 /* MASShortcut.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + GCC_PREFIX_HEADER = "Target Support Files/MASShortcut/MASShortcut-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MASShortcut/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.6; + MODULEMAP_FILE = "Target Support Files/MASShortcut/MASShortcut.modulemap"; + PRODUCT_NAME = MASShortcut; SDKROOT = macosx; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - E408EB62CC8A2272E3D5D347991F240D /* Debug */ = { + B2F84BB079C7C6D70C2D3424C89A317F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3F3B4679D9E78EFD2FF88087203A48C6 /* RxCocoa.xcconfig */; + baseConfigurationReference = 4CE700501A5FBA06F359007666C43958 /* Alamofire.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_VERSION = A; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/RxCocoa/RxCocoa-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/RxCocoa/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.10; - MODULEMAP_FILE = "Target Support Files/RxCocoa/RxCocoa.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = RxCocoa; + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + PRODUCT_NAME = Alamofire; SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - F0EA07314D673F0102E08D1AE900D484 /* Release */ = { + C99271978245C97876F72EBC3C6563ED /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EAECCA61F07E82955E0CA24C52AAF475 /* BRLOptionParser.xcconfig */; + baseConfigurationReference = 98522BF2EB25C0255284080F9CA3E195 /* Pods-ShadowsocksX-NG.debug.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - EXECUTABLE_PREFIX = lib; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch"; - MACOSX_DEPLOYMENT_TARGET = 10.7; - MTL_ENABLE_DEBUG_INFO = NO; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MODULEMAP_FILE = "Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PRODUCT_NAME = "$(TARGET_NAME)"; - PUBLIC_HEADERS_FOLDER_PATH = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_ShadowsocksX_NG; SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - F1B067679E8618A86DA283BCD4698C6D /* Debug */ = { + E4E33ED50D7F60200978CC42446E6D58 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A7DC3D31C58327F3981DA70B91FF9D28 /* MASShortcut.xcconfig */; + baseConfigurationReference = 2DD2740F8043D2CE9EA5BB7A7DBFC49D /* RxCocoa.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; COMBINE_HIDPI_IMAGES = YES; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MASShortcut"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/MASShortcut/ResourceBundle-MASShortcut-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - MACOSX_DEPLOYMENT_TARGET = 10.6; - PRODUCT_NAME = MASShortcut; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + GCC_PREFIX_HEADER = "Target Support Files/RxCocoa/RxCocoa-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/RxCocoa/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MODULEMAP_FILE = "Target Support Files/RxCocoa/RxCocoa.modulemap"; + PRODUCT_NAME = RxCocoa; SDKROOT = macosx; SKIP_INSTALL = YES; - WRAPPER_EXTENSION = bundle; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Debug; }; - F72F4F6D8102F41B7F5F58FE0DA7FDAD /* Debug */ = { + F9052EF393B6D890664BCF053BB54BFB /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EAECCA61F07E82955E0CA24C52AAF475 /* BRLOptionParser.xcconfig */; + baseConfigurationReference = BDE9D3194329F41EB9A694107DB540EE /* RxSwift.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - EXECUTABLE_PREFIX = lib; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch"; - MACOSX_DEPLOYMENT_TARGET = 10.7; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PRODUCT_NAME = "$(TARGET_NAME)"; - PUBLIC_HEADERS_FOLDER_PATH = ""; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + GCC_PREFIX_HEADER = "Target Support Files/RxSwift/RxSwift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/RxSwift/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MODULEMAP_FILE = "Target Support Files/RxSwift/RxSwift.modulemap"; + PRODUCT_NAME = RxSwift; SDKROOT = macosx; + SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Debug; }; @@ -2849,8 +2842,8 @@ 010811070A86F912EA0CD2BB98136CD9 /* Build configuration list for PBXNativeTarget "GCDWebServer" */ = { isa = XCConfigurationList; buildConfigurations = ( - C47912F2809D7A6562A6FB5F738EA705 /* Debug */, - ADE16BF5D9415B20062C86CEE527EAD8 /* Release */, + 517CFD2BFFC625AF59D3081574562C7C /* Debug */, + 157463F8BA9AC88622CED9BD197CFDBD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2858,8 +2851,8 @@ 246647E8AB354727F9ECD0879805161F /* Build configuration list for PBXNativeTarget "Pods-proxy_conf_helper" */ = { isa = XCConfigurationList; buildConfigurations = ( - 87B437463CE3AEA04B9E52EC25693B5B /* Debug */, - 2A0A67E0E8A2EA509035561EE4AFB8EB /* Release */, + 52B3502E90247836A684BCE55D949DFB /* Debug */, + 38AFE42E0B6F59BF0F8C611B2315CE8A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2867,8 +2860,8 @@ 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - C76696C6EF5FBA0EAD947FF559CA3ADF /* Debug */, - 4768537DA1BF950E679ED85F03C11F37 /* Release */, + 3918C3731F97F7B1A6B91CA53EA9B086 /* Debug */, + 6560A4AFF004D1420AB4047ED7B3E45A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2876,8 +2869,8 @@ 3F916C3627231C409340EF9C88C37F7E /* Build configuration list for PBXNativeTarget "MASShortcut" */ = { isa = XCConfigurationList; buildConfigurations = ( - 46A3C7E91154C2330969A66B9480072A /* Debug */, - 4B824F36959F7509C6EADD5D7C0BBF70 /* Release */, + AB22803FF442FDA32B9017FBF80DF1A8 /* Debug */, + 602E11CAE6E17BD0FB30DD5EE3E0E88A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2885,8 +2878,8 @@ 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget "Alamofire" */ = { isa = XCConfigurationList; buildConfigurations = ( - 4EE6FA9CE312F9796EF2038BF1B9BC03 /* Debug */, - 7AECFCD77D8667B289BE7C6B62D614A5 /* Release */, + B2F84BB079C7C6D70C2D3424C89A317F /* Debug */, + 0A9023DCD8653BA4D6E580B803AAB761 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2894,8 +2887,8 @@ 4B561109B4C51E9DC9F5F27E9C033405 /* Build configuration list for PBXNativeTarget "BRLOptionParser" */ = { isa = XCConfigurationList; buildConfigurations = ( - F72F4F6D8102F41B7F5F58FE0DA7FDAD /* Debug */, - F0EA07314D673F0102E08D1AE900D484 /* Release */, + 353215786D69646983337802C8F2A8A3 /* Debug */, + 3E4FE876BE3FE23B968D72994E45F33E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2903,8 +2896,8 @@ 78B338CAC10BFFE58C0DE5D189212D60 /* Build configuration list for PBXNativeTarget "Pods-ShadowsocksX-NGTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - D13D4430BCE0A99C4D768DB5B9EAFAB4 /* Debug */, - 09AC259EF48E4803CFA133821B50928D /* Release */, + 014D6135D20B2A831876728B582DD866 /* Debug */, + 585970A6B2E97B1118A2E7870AE18684 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2912,8 +2905,8 @@ B2542ED88CE98D477B8D38769095CE5E /* Build configuration list for PBXNativeTarget "MASShortcut-MASShortcut" */ = { isa = XCConfigurationList; buildConfigurations = ( - F1B067679E8618A86DA283BCD4698C6D /* Debug */, - 7F85541659A067CF326B2DF15039555D /* Release */, + 312ACE5D8CB6F9064A5725F7C4CF9B12 /* Debug */, + 7DDA088AC519B45C54DE31DD7B6A497F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2921,8 +2914,8 @@ C3C04E339BA1928DBC29CEFD07DC6ADF /* Build configuration list for PBXNativeTarget "RxSwift" */ = { isa = XCConfigurationList; buildConfigurations = ( - 4C8680BBF2C4646A883AEB692C45DD0D /* Debug */, - A874781789BD2BC39A2EEBE7AA84D7D7 /* Release */, + F9052EF393B6D890664BCF053BB54BFB /* Debug */, + 172C3A07261D84F0894DEDBF9913ECB2 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2930,8 +2923,8 @@ D913F5C08F647E9FCC34C3A5B3030BD5 /* Build configuration list for PBXNativeTarget "RxCocoa" */ = { isa = XCConfigurationList; buildConfigurations = ( - E408EB62CC8A2272E3D5D347991F240D /* Debug */, - CBD587DEE79227D0D9EAEE32BD70E73A /* Release */, + E4E33ED50D7F60200978CC42446E6D58 /* Debug */, + 7E6BB39B8757E394B68675AD8FE6EFB3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2939,8 +2932,8 @@ E185892330EBDCF4E8B37928210771A9 /* Build configuration list for PBXNativeTarget "Pods-ShadowsocksX-NG" */ = { isa = XCConfigurationList; buildConfigurations = ( - B1C5C16388542F2BCF0FA9DE3F656346 /* Debug */, - 8A32AE3640D5D14C935BD041CF0BD1B3 /* Release */, + C99271978245C97876F72EBC3C6563ED /* Debug */, + 84C19B554DB00F35C8105BC241A1C0E9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/RxCocoa/Platform/DataStructures/Bag.swift b/Pods/RxCocoa/Platform/DataStructures/Bag.swift index 897cdadf..002c3a6c 100644 --- a/Pods/RxCocoa/Platform/DataStructures/Bag.swift +++ b/Pods/RxCocoa/Platform/DataStructures/Bag.swift @@ -80,15 +80,11 @@ struct Bag : CustomDebugStringConvertible { } if _pairs.count < arrayDictionaryMaxSize { - _pairs.append(key: key, value: element) + _pairs.append((key: key, value: element)) return key } - - if _dictionary == nil { - _dictionary = [:] - } - - _dictionary![key] = element + + _dictionary = [key: element] return key } diff --git a/Pods/RxCocoa/Platform/DataStructures/PriorityQueue.swift b/Pods/RxCocoa/Platform/DataStructures/PriorityQueue.swift index fae70a05..9b2c370e 100644 --- a/Pods/RxCocoa/Platform/DataStructures/PriorityQueue.swift +++ b/Pods/RxCocoa/Platform/DataStructures/PriorityQueue.swift @@ -52,7 +52,11 @@ struct PriorityQueue { private mutating func removeAt(_ index: Int) { let removingLast = index == _elements.count - 1 if !removingLast { + #if swift(>=3.2) + _elements.swapAt(index, _elements.count - 1) + #else swap(&_elements[index], &_elements[_elements.count - 1]) + #endif } _ = _elements.popLast() @@ -72,8 +76,11 @@ struct PriorityQueue { while unbalancedIndex > 0 { let parentIndex = (unbalancedIndex - 1) / 2 guard _hasHigherPriority(_elements[unbalancedIndex], _elements[parentIndex]) else { break } - + #if swift(>=3.2) + _elements.swapAt(unbalancedIndex, parentIndex) + #else swap(&_elements[unbalancedIndex], &_elements[parentIndex]) + #endif unbalancedIndex = parentIndex } } @@ -99,7 +106,11 @@ struct PriorityQueue { guard highestPriorityIndex != unbalancedIndex else { break } + #if swift(>=3.2) + _elements.swapAt(highestPriorityIndex, unbalancedIndex) + #else swap(&_elements[highestPriorityIndex], &_elements[unbalancedIndex]) + #endif unbalancedIndex = highestPriorityIndex } } diff --git a/Pods/RxCocoa/Platform/DeprecationWarner.swift b/Pods/RxCocoa/Platform/DeprecationWarner.swift new file mode 100644 index 00000000..863636b7 --- /dev/null +++ b/Pods/RxCocoa/Platform/DeprecationWarner.swift @@ -0,0 +1,43 @@ +// +// DeprecationWarner.swift +// Platform +// +// Created by Shai Mishali on 1/9/18. +// Copyright © 2018 Krunoslav Zaher. All rights reserved. +// + +import Foundation + +#if DEBUG + class DeprecationWarner { + private static var warned = Set() + private static var _lock = NSRecursiveLock() + + static func warnIfNeeded(_ kind: Kind) { + _lock.lock(); defer { _lock.unlock() } + guard !warned.contains(kind) else { return } + + warned.insert(kind) + print("ℹ️ [DEPRECATED] \(kind.message)") + } + } + + extension DeprecationWarner { + enum Kind { + case variable + case globalTestFunctionNext + case globalTestFunctionError + case globalTestFunctionCompleted + + var message: String { + switch self { + case .variable: return "`Variable` is planned for future deprecation. Please consider `BehaviorRelay` as a replacement. Read more at: https://git.io/vNqvx" + case .globalTestFunctionNext: return "The `next()` global function is planned for future deprecation. Please use `Recorded.next()` instead." + case .globalTestFunctionError: return "The `error()` global function is planned for future deprecation. Please use `Recorded.error()` instead." + case .globalTestFunctionCompleted: return "The `completed()` global function is planned for future deprecation. Please use `Recorded.completed()` instead." + } + } + } + } +#endif + diff --git a/Pods/RxCocoa/README.md b/Pods/RxCocoa/README.md index bdf8a2ba..a423675a 100644 --- a/Pods/RxCocoa/README.md +++ b/Pods/RxCocoa/README.md @@ -3,6 +3,8 @@ [![Travis CI](https://travis-ci.org/ReactiveX/RxSwift.svg?branch=master)](https://travis-ci.org/ReactiveX/RxSwift) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-333333.svg) ![pod](https://img.shields.io/cocoapods/v/RxSwift.svg) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) +* RxSwift 3.x / Swift 3.x can be found in [**rxswift-3.0** branch](https://github.com/ReactiveX/RxSwift/tree/rxswift-3.0). + Rx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable` interface. This is a Swift version of [Rx](https://github.com/Reactive-Extensions/Rx.NET). @@ -39,10 +41,10 @@ KVO observing, async operations and streams are all unified under [abstraction o ###### ... interact -* All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences.
[![Slack channel](http://rxswift-slack.herokuapp.com/badge.svg)](http://rxswift-slack.herokuapp.com/) [Join Slack Channel](http://rxswift-slack.herokuapp.com) +* All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences.
[![Slack channel](http://rxswift-slack.herokuapp.com/badge.svg)](http://bit.ly/rxslack) [Join Slack Channel](http://bit.ly/rxslack) * Report a problem using the library. [Open an Issue With Bug Template](.github/ISSUE_TEMPLATE.md) * Request a new feature. [Open an Issue With Feature Request Template](Documentation/NewFeatureRequestTemplate.md) - +* Help out [Check out contribution guide](CONTRIBUTING.md) ###### ... compare @@ -102,8 +104,9 @@ searchResults ## Requirements -* Xcode 8.0 -* Swift 3.0 +* Xcode 9.0 +* Swift 4.0 +* Swift 3.x ([use `rxswift-3.0` branch](https://github.com/ReactiveX/RxSwift/tree/rxswift-3.0) instead) * Swift 2.3 ([use `rxswift-2.0` branch](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) instead) ## Installation @@ -118,21 +121,21 @@ Open Rx.xcworkspace, choose `RxExample` and hit run. This method will build ever ### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html) -**Tested with `pod --version`: `1.1.1`** +**Tested with `pod --version`: `1.3.1`** ```ruby # Podfile use_frameworks! target 'YOUR_TARGET_NAME' do - pod 'RxSwift', '~> 3.0' - pod 'RxCocoa', '~> 3.0' + pod 'RxSwift', '~> 4.0' + pod 'RxCocoa', '~> 4.0' end # RxTests and RxBlocking make the most sense in the context of unit/integration tests target 'YOUR_TESTING_TARGET' do - pod 'RxBlocking', '~> 3.0' - pod 'RxTest', '~> 3.0' + pod 'RxBlocking', '~> 4.0' + pod 'RxTest', '~> 4.0' end ``` @@ -144,12 +147,12 @@ $ pod install ### [Carthage](https://github.com/Carthage/Carthage) -**Tested with `carthage version`: `0.18.1`** +**Tested with `carthage version`: `0.26.2`** Add this to `Cartfile` ``` -github "ReactiveX/RxSwift" ~> 3.0 +github "ReactiveX/RxSwift" ~> 4.0 ``` ```bash @@ -158,19 +161,23 @@ $ carthage update ### [Swift Package Manager](https://github.com/apple/swift-package-manager) -**Tested with `swift build --version`: `3.0.0 (swiftpm-19)`** +**Tested with `swift build --version`: `Swift 4.0.0-dev (swiftpm-13126)`** Create a `Package.swift` file. ```swift +// swift-tools-version:4.0 + import PackageDescription let package = Package( - name: "RxTestProject", - targets: [], - dependencies: [ - .Package(url: "https://github.com/ReactiveX/RxSwift.git", majorVersion: 3) - ] + name: "RxTestProject", + dependencies: [ + .package(url: "https://github.com/ReactiveX/RxSwift.git", "4.0.0" ..< "5.0.0") + ], + targets: [ + .target(name: "RxTestProject", dependencies: ["RxSwift", "RxCocoa"]) + ] ) ``` diff --git a/Pods/RxCocoa/RxCocoa/Common/Binder.swift b/Pods/RxCocoa/RxCocoa/Common/Binder.swift new file mode 100644 index 00000000..129af567 --- /dev/null +++ b/Pods/RxCocoa/RxCocoa/Common/Binder.swift @@ -0,0 +1,61 @@ +// +// Binder.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 9/17/17. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +import RxSwift + +/** + Observer that enforces interface binding rules: + * can't bind errors (in debug builds binding of errors causes `fatalError` in release builds errors are being logged) + * ensures binding is performed on a specific scheduler + + `Binder` doesn't retain target and in case target is released, element isn't bound. + + By default it binds elements on main scheduler. + */ +public struct Binder: ObserverType { + public typealias E = Value + + private let _binding: (Event) -> () + + /// Initializes `Binder` + /// + /// - parameter target: Target object. + /// - parameter scheduler: Scheduler used to bind the events. + /// - parameter binding: Binding logic. + public init(_ target: Target, scheduler: ImmediateSchedulerType = MainScheduler(), binding: @escaping (Target, Value) -> ()) { + weak var weakTarget = target + + _binding = { event in + switch event { + case .next(let element): + _ = scheduler.schedule(element) { element in + if let target = weakTarget { + binding(target, element) + } + return Disposables.create() + } + case .error(let error): + bindingError(error) + case .completed: + break + } + } + } + + /// Binds next element to owner view as described in `binding`. + public func on(_ event: Event) { + _binding(event) + } + + /// Erases type of observer. + /// + /// - returns: type erased observer. + public func asObserver() -> AnyObserver { + return AnyObserver(eventHandler: on) + } +} diff --git a/Pods/RxCocoa/RxCocoa/Common/ControlTarget.swift b/Pods/RxCocoa/RxCocoa/Common/ControlTarget.swift index 5a7fddec..24ace8e5 100644 --- a/Pods/RxCocoa/RxCocoa/Common/ControlTarget.swift +++ b/Pods/RxCocoa/RxCocoa/Common/ControlTarget.swift @@ -8,9 +8,7 @@ #if os(iOS) || os(tvOS) || os(macOS) -#if !RX_NO_MODULE import RxSwift -#endif #if os(iOS) || os(tvOS) import UIKit @@ -70,7 +68,7 @@ final class ControlTarget: RxTarget { } #endif - func eventHandler(_ sender: Control!) { + @objc func eventHandler(_ sender: Control!) { if let callback = self.callback, let control = self.control { callback(control) } diff --git a/Pods/RxCocoa/RxCocoa/Common/DelegateProxy.swift b/Pods/RxCocoa/RxCocoa/Common/DelegateProxy.swift index 8b3e850d..979a67e3 100644 --- a/Pods/RxCocoa/RxCocoa/Common/DelegateProxy.swift +++ b/Pods/RxCocoa/RxCocoa/Common/DelegateProxy.swift @@ -8,304 +8,286 @@ #if !os(Linux) -#if !RX_NO_MODULE import RxSwift #if SWIFT_PACKAGE && !os(Linux) import RxCocoaRuntime #endif -#endif -var delegateAssociatedTag: UnsafeRawPointer = UnsafeRawPointer(UnsafeMutablePointer.allocate(capacity: 1)) -var dataSourceAssociatedTag: UnsafeRawPointer = UnsafeRawPointer(UnsafeMutablePointer.allocate(capacity: 1)) + /// Base class for `DelegateProxyType` protocol. + /// + /// This implementation is not thread safe and can be used only from one thread (Main thread). + open class DelegateProxy: _RXDelegateProxy { + public typealias ParentObject = P + public typealias Delegate = D -/// Base class for `DelegateProxyType` protocol. -/// -/// This implementation is not thread safe and can be used only from one thread (Main thread). -open class DelegateProxy : _RXDelegateProxy { + private var _sentMessageForSelector = [Selector: MessageDispatcher]() + private var _methodInvokedForSelector = [Selector: MessageDispatcher]() - private var sentMessageForSelector = [Selector: MessageDispatcher]() - private var methodInvokedForSelector = [Selector: MessageDispatcher]() + /// Parent object associated with delegate proxy. + private weak private(set) var _parentObject: ParentObject? - /// Parent object associated with delegate proxy. - weak private(set) var parentObject: AnyObject? - - /// Initializes new instance. - /// - /// - parameter parentObject: Optional parent object that owns `DelegateProxy` as associated object. - public required init(parentObject: AnyObject) { - self.parentObject = parentObject - - MainScheduler.ensureExecutingOnScheduler() -#if TRACE_RESOURCES - _ = Resources.incrementTotal() -#endif - super.init() - } + fileprivate let _currentDelegateFor: (ParentObject) -> AnyObject? + fileprivate let _setCurrentDelegateTo: (AnyObject?, ParentObject) -> () - /** - Returns observable sequence of invocations of delegate methods. Elements are sent *before method is invoked*. - - Only methods that have `void` return value can be observed using this method because - those methods are used as a notification mechanism. It doesn't matter if they are optional - or not. Observing is performed by installing a hidden associated `PublishSubject` that is - used to dispatch messages to observers. - - Delegate methods that have non `void` return value can't be observed directly using this method - because: - * those methods are not intended to be used as a notification mechanism, but as a behavior customization mechanism - * there is no sensible automatic way to determine a default return value - - In case observing of delegate methods that have return type is required, it can be done by - manually installing a `PublishSubject` or `BehaviorSubject` and implementing delegate method. - - e.g. - - // delegate proxy part (RxScrollViewDelegateProxy) - - let internalSubject = PublishSubject - - public func requiredDelegateMethod(scrollView: UIScrollView, arg1: CGPoint) -> Bool { - internalSubject.on(.next(arg1)) - return self._forwardToDelegate?.requiredDelegateMethod?(scrollView, arg1: arg1) ?? defaultReturnValue - } - - .... + /// Initializes new instance. + /// + /// - parameter parentObject: Optional parent object that owns `DelegateProxy` as associated object. + public init(parentObject: ParentObject, delegateProxy: Proxy.Type) + where Proxy: DelegateProxy, Proxy.ParentObject == ParentObject, Proxy.Delegate == Delegate { + self._parentObject = parentObject + self._currentDelegateFor = delegateProxy._currentDelegate + self._setCurrentDelegateTo = delegateProxy._setCurrentDelegate - // reactive property implementation in a real class (`UIScrollView`) - public var property: Observable { - let proxy = RxScrollViewDelegateProxy.proxyForObject(base) - return proxy.internalSubject.asObservable() - } - - **In case calling this method prints "Delegate proxy is already implementing `\(selector)`, - a more performant way of registering might exist.", that means that manual observing method - is required analog to the example above because delegate method has already been implemented.** - - - parameter selector: Selector used to filter observed invocations of delegate methods. - - returns: Observable sequence of arguments passed to `selector` method. - */ - open func sentMessage(_ selector: Selector) -> Observable<[Any]> { - MainScheduler.ensureExecutingOnScheduler() - checkSelectorIsObservable(selector) - - let subject = sentMessageForSelector[selector] - - if let subject = subject { - return subject.asObservable() - } - else { - let subject = MessageDispatcher(delegateProxy: self) - sentMessageForSelector[selector] = subject - return subject.asObservable() + MainScheduler.ensureExecutingOnScheduler() + #if TRACE_RESOURCES + _ = Resources.incrementTotal() + #endif + super.init() } - } - /** - Returns observable sequence of invoked delegate methods. Elements are sent *after method is invoked*. - - Only methods that have `void` return value can be observed using this method because - those methods are used as a notification mechanism. It doesn't matter if they are optional - or not. Observing is performed by installing a hidden associated `PublishSubject` that is - used to dispatch messages to observers. - - Delegate methods that have non `void` return value can't be observed directly using this method - because: - * those methods are not intended to be used as a notification mechanism, but as a behavior customization mechanism - * there is no sensible automatic way to determine a default return value - - In case observing of delegate methods that have return type is required, it can be done by - manually installing a `PublishSubject` or `BehaviorSubject` and implementing delegate method. - - e.g. - - // delegate proxy part (RxScrollViewDelegateProxy) - - let internalSubject = PublishSubject - - public func requiredDelegateMethod(scrollView: UIScrollView, arg1: CGPoint) -> Bool { - internalSubject.on(.next(arg1)) - return self._forwardToDelegate?.requiredDelegateMethod?(scrollView, arg1: arg1) ?? defaultReturnValue - } - + /** + Returns observable sequence of invocations of delegate methods. Elements are sent *before method is invoked*. + + Only methods that have `void` return value can be observed using this method because + those methods are used as a notification mechanism. It doesn't matter if they are optional + or not. Observing is performed by installing a hidden associated `PublishSubject` that is + used to dispatch messages to observers. + + Delegate methods that have non `void` return value can't be observed directly using this method + because: + * those methods are not intended to be used as a notification mechanism, but as a behavior customization mechanism + * there is no sensible automatic way to determine a default return value + + In case observing of delegate methods that have return type is required, it can be done by + manually installing a `PublishSubject` or `BehaviorSubject` and implementing delegate method. + + e.g. + + // delegate proxy part (RxScrollViewDelegateProxy) + + let internalSubject = PublishSubject + + public func requiredDelegateMethod(scrollView: UIScrollView, arg1: CGPoint) -> Bool { + internalSubject.on(.next(arg1)) + return self._forwardToDelegate?.requiredDelegateMethod?(scrollView, arg1: arg1) ?? defaultReturnValue + } + .... - // reactive property implementation in a real class (`UIScrollView`) - public var property: Observable { - let proxy = RxScrollViewDelegateProxy.proxyForObject(base) - return proxy.internalSubject.asObservable() - } + // reactive property implementation in a real class (`UIScrollView`) + public var property: Observable { + let proxy = RxScrollViewDelegateProxy.proxy(for: base) + return proxy.internalSubject.asObservable() + } - **In case calling this method prints "Delegate proxy is already implementing `\(selector)`, - a more performant way of registering might exist.", that means that manual observing method - is required analog to the example above because delegate method has already been implemented.** + **In case calling this method prints "Delegate proxy is already implementing `\(selector)`, + a more performant way of registering might exist.", that means that manual observing method + is required analog to the example above because delegate method has already been implemented.** - - parameter selector: Selector used to filter observed invocations of delegate methods. - - returns: Observable sequence of arguments passed to `selector` method. - */ - open func methodInvoked(_ selector: Selector) -> Observable<[Any]> { - MainScheduler.ensureExecutingOnScheduler() - checkSelectorIsObservable(selector) + - parameter selector: Selector used to filter observed invocations of delegate methods. + - returns: Observable sequence of arguments passed to `selector` method. + */ + open func sentMessage(_ selector: Selector) -> Observable<[Any]> { + MainScheduler.ensureExecutingOnScheduler() - let subject = methodInvokedForSelector[selector] + let subject = _sentMessageForSelector[selector] - if let subject = subject { - return subject.asObservable() - } - else { - let subject = MessageDispatcher(delegateProxy: self) - methodInvokedForSelector[selector] = subject - return subject.asObservable() + if let subject = subject { + return subject.asObservable() + } + else { + let subject = MessageDispatcher(selector: selector, delegateProxy: self) + _sentMessageForSelector[selector] = subject + return subject.asObservable() + } } - } - private func checkSelectorIsObservable(_ selector: Selector) { - MainScheduler.ensureExecutingOnScheduler() + /** + Returns observable sequence of invoked delegate methods. Elements are sent *after method is invoked*. - if hasWiredImplementation(for: selector) { - print("Delegate proxy is already implementing `\(selector)`, a more performant way of registering might exist.") - return - } + Only methods that have `void` return value can be observed using this method because + those methods are used as a notification mechanism. It doesn't matter if they are optional + or not. Observing is performed by installing a hidden associated `PublishSubject` that is + used to dispatch messages to observers. - guard (self.forwardToDelegate()?.responds(to: selector) ?? false) || voidDelegateMethodsContain(selector) else { - rxFatalError("This class doesn't respond to selector \(selector)") - } - } + Delegate methods that have non `void` return value can't be observed directly using this method + because: + * those methods are not intended to be used as a notification mechanism, but as a behavior customization mechanism + * there is no sensible automatic way to determine a default return value - // proxy + In case observing of delegate methods that have return type is required, it can be done by + manually installing a `PublishSubject` or `BehaviorSubject` and implementing delegate method. - open override func _sentMessage(_ selector: Selector, withArguments arguments: [Any]) { - sentMessageForSelector[selector]?.on(.next(arguments)) - } + e.g. - open override func _methodInvoked(_ selector: Selector, withArguments arguments: [Any]) { - methodInvokedForSelector[selector]?.on(.next(arguments)) - } + // delegate proxy part (RxScrollViewDelegateProxy) - /// Returns tag used to identify associated object. - /// - /// - returns: Associated object tag. - open class func delegateAssociatedObjectTag() -> UnsafeRawPointer { - return delegateAssociatedTag - } - - /// Initializes new instance of delegate proxy. - /// - /// - returns: Initialized instance of `self`. - open class func createProxyForObject(_ object: AnyObject) -> AnyObject { - return self.init(parentObject: object) - } - - /// Returns assigned proxy for object. - /// - /// - parameter object: Object that can have assigned delegate proxy. - /// - returns: Assigned delegate proxy or `nil` if no delegate proxy is assigned. - open class func assignedProxyFor(_ object: AnyObject) -> AnyObject? { - let maybeDelegate = objc_getAssociatedObject(object, self.delegateAssociatedObjectTag()) - return castOptionalOrFatalError(maybeDelegate.map { $0 as AnyObject }) - } - - /// Assigns proxy to object. - /// - /// - parameter object: Object that can have assigned delegate proxy. - /// - parameter proxy: Delegate proxy object to assign to `object`. - open class func assignProxy(_ proxy: AnyObject, toObject object: AnyObject) { - precondition(proxy.isKind(of: self.classForCoder())) - - objc_setAssociatedObject(object, self.delegateAssociatedObjectTag(), proxy, .OBJC_ASSOCIATION_RETAIN) - } - - /// Sets reference of normal delegate that receives all forwarded messages - /// through `self`. - /// - /// - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`. - /// - parameter retainDelegate: Should `self` retain `forwardToDelegate`. - open func setForwardToDelegate(_ delegate: AnyObject?, retainDelegate: Bool) { - #if DEBUG // 4.0 all configurations + let internalSubject = PublishSubject + + public func requiredDelegateMethod(scrollView: UIScrollView, arg1: CGPoint) -> Bool { + internalSubject.on(.next(arg1)) + return self._forwardToDelegate?.requiredDelegateMethod?(scrollView, arg1: arg1) ?? defaultReturnValue + } + + .... + + // reactive property implementation in a real class (`UIScrollView`) + public var property: Observable { + let proxy = RxScrollViewDelegateProxy.proxy(for: base) + return proxy.internalSubject.asObservable() + } + + **In case calling this method prints "Delegate proxy is already implementing `\(selector)`, + a more performant way of registering might exist.", that means that manual observing method + is required analog to the example above because delegate method has already been implemented.** + + - parameter selector: Selector used to filter observed invocations of delegate methods. + - returns: Observable sequence of arguments passed to `selector` method. + */ + open func methodInvoked(_ selector: Selector) -> Observable<[Any]> { MainScheduler.ensureExecutingOnScheduler() - #endif - self._setForward(toDelegate: delegate, retainDelegate: retainDelegate) - self.reset() - } - - /// Returns reference of normal delegate that receives all forwarded messages - /// through `self`. - /// - /// - returns: Value of reference if set or nil. - open func forwardToDelegate() -> AnyObject? { - return self._forwardToDelegate - } - private func hasObservers(selector: Selector) -> Bool { - return (sentMessageForSelector[selector]?.hasObservers ?? false) - || (methodInvokedForSelector[selector]?.hasObservers ?? false) - } - - override open func responds(to aSelector: Selector!) -> Bool { - return super.responds(to: aSelector) - || (self._forwardToDelegate?.responds(to: aSelector) ?? false) - || (self.voidDelegateMethodsContain(aSelector) && self.hasObservers(selector: aSelector)) - } + let subject = _methodInvokedForSelector[selector] - internal func reset() { - guard let delegateProxySelf = self as? DelegateProxyType else { - rxFatalErrorInDebug("\(self) doesn't implement delegate proxy type.") - return + if let subject = subject { + return subject.asObservable() + } + else { + let subject = MessageDispatcher(selector: selector, delegateProxy: self) + _methodInvokedForSelector[selector] = subject + return subject.asObservable() + } } - - guard let parentObject = self.parentObject else { return } - let selfType = type(of: delegateProxySelf) + fileprivate func checkSelectorIsObservable(_ selector: Selector) { + MainScheduler.ensureExecutingOnScheduler() - let maybeCurrentDelegate = selfType.currentDelegateFor(parentObject) + if hasWiredImplementation(for: selector) { + print("⚠️ Delegate proxy is already implementing `\(selector)`, a more performant way of registering might exist.") + return + } + + if voidDelegateMethodsContain(selector) { + return + } + + // In case `_forwardToDelegate` is `nil`, it is assumed the check is being done prematurely. + if !(self._forwardToDelegate?.responds(to: selector) ?? true) { + print("⚠️ Using delegate proxy dynamic interception method but the target delegate object doesn't respond to the requested selector. " + + "In case pure Swift delegate proxy is being used please use manual observing method by using`PublishSubject`s. " + + " (selector: `\(selector)`, forwardToDelegate: `\(_forwardToDelegate ?? self)`)") + } + } - if maybeCurrentDelegate === self { - selfType.setCurrentDelegate(nil, toObject: parentObject) - selfType.setCurrentDelegate(self, toObject: parentObject) + // proxy + + open override func _sentMessage(_ selector: Selector, withArguments arguments: [Any]) { + _sentMessageForSelector[selector]?.on(.next(arguments)) } - } - deinit { - for v in sentMessageForSelector.values { - v.on(.completed) + open override func _methodInvoked(_ selector: Selector, withArguments arguments: [Any]) { + _methodInvokedForSelector[selector]?.on(.next(arguments)) } - for v in methodInvokedForSelector.values { - v.on(.completed) + + /// Returns reference of normal delegate that receives all forwarded messages + /// through `self`. + /// + /// - returns: Value of reference if set or nil. + open func forwardToDelegate() -> Delegate? { + return castOptionalOrFatalError(self._forwardToDelegate) } -#if TRACE_RESOURCES - _ = Resources.decrementTotal() -#endif - } -} -fileprivate let mainScheduler = MainScheduler() + /// Sets reference of normal delegate that receives all forwarded messages + /// through `self`. + /// + /// - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`. + /// - parameter retainDelegate: Should `self` retain `forwardToDelegate`. + open func setForwardToDelegate(_ delegate: Delegate?, retainDelegate: Bool) { + #if DEBUG // 4.0 all configurations + MainScheduler.ensureExecutingOnScheduler() + #endif + self._setForwardToDelegate(delegate, retainDelegate: retainDelegate) + + let sentSelectors: [Selector] = self._sentMessageForSelector.values.filter { $0.hasObservers }.map { $0.selector } + let invokedSelectors: [Selector] = self._methodInvokedForSelector.values.filter { $0.hasObservers }.map { $0.selector } + let allUsedSelectors = sentSelectors + invokedSelectors + + for selector in Set(allUsedSelectors) { + checkSelectorIsObservable(selector) + } + + self.reset() + } -fileprivate final class MessageDispatcher { - private let dispatcher: PublishSubject<[Any]> - private let result: Observable<[Any]> + private func hasObservers(selector: Selector) -> Bool { + return (_sentMessageForSelector[selector]?.hasObservers ?? false) + || (_methodInvokedForSelector[selector]?.hasObservers ?? false) + } - init(delegateProxy _delegateProxy: DelegateProxy) { - weak var weakDelegateProxy = _delegateProxy + override open func responds(to aSelector: Selector!) -> Bool { + return super.responds(to: aSelector) + || (self._forwardToDelegate?.responds(to: aSelector) ?? false) + || (self.voidDelegateMethodsContain(aSelector) && self.hasObservers(selector: aSelector)) + } - let dispatcher = PublishSubject<[Any]>() - self.dispatcher = dispatcher + fileprivate func reset() { + guard let parentObject = self._parentObject else { return } - self.result = dispatcher - .do(onSubscribed: { weakDelegateProxy?.reset() }, onDispose: { weakDelegateProxy?.reset() }) - .share() - .subscribeOn(mainScheduler) - } + let maybeCurrentDelegate = _currentDelegateFor(parentObject) - var on: (Event<[Any]>) -> () { - return self.dispatcher.on - } + if maybeCurrentDelegate === self { + _setCurrentDelegateTo(nil, parentObject) + _setCurrentDelegateTo(castOrFatalError(self), parentObject) + } + } + + deinit { + for v in _sentMessageForSelector.values { + v.on(.completed) + } + for v in _methodInvokedForSelector.values { + v.on(.completed) + } + #if TRACE_RESOURCES + _ = Resources.decrementTotal() + #endif + } + - var hasObservers: Bool { - return self.dispatcher.hasObservers } - func asObservable() -> Observable<[Any]> { - return self.result + fileprivate let mainScheduler = MainScheduler() + + fileprivate final class MessageDispatcher { + private let dispatcher: PublishSubject<[Any]> + private let result: Observable<[Any]> + + fileprivate let selector: Selector + + init(selector: Selector, delegateProxy _delegateProxy: DelegateProxy) { + weak var weakDelegateProxy = _delegateProxy + + let dispatcher = PublishSubject<[Any]>() + self.dispatcher = dispatcher + self.selector = selector + + self.result = dispatcher + .do(onSubscribed: { weakDelegateProxy?.checkSelectorIsObservable(selector); weakDelegateProxy?.reset() }, onDispose: { weakDelegateProxy?.reset() }) + .share() + .subscribeOn(mainScheduler) + } + + var on: (Event<[Any]>) -> () { + return self.dispatcher.on + } + + var hasObservers: Bool { + return self.dispatcher.hasObservers + } + + func asObservable() -> Observable<[Any]> { + return self.result + } } -} #endif diff --git a/Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift b/Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift index f964784b..51a0d564 100644 --- a/Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift +++ b/Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift @@ -8,9 +8,10 @@ #if !os(Linux) -#if !RX_NO_MODULE -import RxSwift -#endif + import func Foundation.objc_getAssociatedObject + import func Foundation.objc_setAssociatedObject + + import RxSwift /** `DelegateProxyType` protocol enables using both normal delegates and Rx observable sequences with @@ -21,7 +22,7 @@ for specific views. Type implementing `DelegateProxyType` should never be initialized directly. -To fetch initialized instance of type implementing `DelegateProxyType`, `proxyForObject` method +To fetch initialized instance of type implementing `DelegateProxyType`, `proxy` method should be used. This is more or less how it works. @@ -55,60 +56,41 @@ This is more or less how it works. +-------------------------------------------+ -Since RxCocoa needs to automagically create those Proxys -..and because views that have delegates can be hierarchical +Since RxCocoa needs to automagically create those Proxys and because views that have delegates can be hierarchical -UITableView : UIScrollView : UIView + UITableView : UIScrollView : UIView .. and corresponding delegates are also hierarchical -UITableViewDelegate : UIScrollViewDelegate : NSObject - -.. and sometimes there can be only one proxy/delegate registered, -every view has a corresponding delegate virtual factory method. - -In case of UITableView / UIScrollView, there is - - extension UIScrollView { - public func createRxDelegateProxy() -> RxScrollViewDelegateProxy { - return RxScrollViewDelegateProxy(parentObject: base) - } - .... - - -and override in UITableView + UITableViewDelegate : UIScrollViewDelegate : NSObject - extension UITableView { - public override func createRxDelegateProxy() -> RxScrollViewDelegateProxy { - .... +... this mechanism can be extended by using the following snippet in `registerKnownImplementations` or in some other + part of your app that executes before using `rx.*` (e.g. appDidFinishLaunching). + RxScrollViewDelegateProxy.register { RxTableViewDelegateProxy(parentObject: $0) } */ -public protocol DelegateProxyType : AnyObject { - /// Creates new proxy for target object. - static func createProxyForObject(_ object: AnyObject) -> AnyObject - - /// Returns assigned proxy for object. - /// - /// - parameter object: Object that can have assigned delegate proxy. - /// - returns: Assigned delegate proxy or `nil` if no delegate proxy is assigned. - static func assignedProxyFor(_ object: AnyObject) -> AnyObject? - - /// Assigns proxy to object. - /// - /// - parameter object: Object that can have assigned delegate proxy. - /// - parameter proxy: Delegate proxy object to assign to `object`. - static func assignProxy(_ proxy: AnyObject, toObject object: AnyObject) +public protocol DelegateProxyType: class { + associatedtype ParentObject: AnyObject + associatedtype Delegate + /// It is require that enumerate call `register` of the extended DelegateProxy subclasses here. + static func registerKnownImplementations() + + /// Unique identifier for delegate + static var identifier: UnsafeRawPointer { get } + /// Returns designated delegate property for object. /// /// Objects can have multiple delegate properties. /// /// Each delegate property needs to have it's own type implementing `DelegateProxyType`. /// + /// It's abstract method. + /// /// - parameter object: Object that has delegate property. /// - returns: Value of delegate property. - static func currentDelegateFor(_ object: AnyObject) -> AnyObject? + static func currentDelegate(for object: ParentObject) -> Delegate? /// Sets designated delegate property for object. /// @@ -116,25 +98,71 @@ public protocol DelegateProxyType : AnyObject { /// /// Each delegate property needs to have it's own type implementing `DelegateProxyType`. /// + /// It's abstract method. + /// /// - parameter toObject: Object that has delegate property. /// - parameter delegate: Delegate value. - static func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) - + static func setCurrentDelegate(_ delegate: Delegate?, to object: ParentObject) + /// Returns reference of normal delegate that receives all forwarded messages /// through `self`. /// /// - returns: Value of reference if set or nil. - func forwardToDelegate() -> AnyObject? + func forwardToDelegate() -> Delegate? /// Sets reference of normal delegate that receives all forwarded messages /// through `self`. /// /// - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`. /// - parameter retainDelegate: Should `self` retain `forwardToDelegate`. - func setForwardToDelegate(_ forwardToDelegate: AnyObject?, retainDelegate: Bool) + func setForwardToDelegate(_ forwardToDelegate: Delegate?, retainDelegate: Bool) +} + +// default implementations +extension DelegateProxyType { + /// Unique identifier for delegate + public static var identifier: UnsafeRawPointer { + let delegateIdentifier = ObjectIdentifier(Delegate.self) + let integerIdentifier = Int(bitPattern: delegateIdentifier) + return UnsafeRawPointer(bitPattern: integerIdentifier)! + } } +// workaround of Delegate: class extension DelegateProxyType { + static func _currentDelegate(for object: ParentObject) -> AnyObject? { + return currentDelegate(for: object).map { $0 as AnyObject } + } + + static func _setCurrentDelegate(_ delegate: AnyObject?, to object: ParentObject) { + return setCurrentDelegate(castOptionalOrFatalError(delegate), to: object) + } + + func _forwardToDelegate() -> AnyObject? { + return forwardToDelegate().map { $0 as AnyObject } + } + + func _setForwardToDelegate(_ forwardToDelegate: AnyObject?, retainDelegate: Bool) { + return setForwardToDelegate(castOptionalOrFatalError(forwardToDelegate), retainDelegate: retainDelegate) + } +} + +extension DelegateProxyType { + + /// Store DelegateProxy subclass to factory. + /// When make 'Rx*DelegateProxy' subclass, call 'Rx*DelegateProxySubclass.register(for:_)' 1 time, or use it in DelegateProxyFactory + /// 'Rx*DelegateProxy' can have one subclass implementation per concrete ParentObject type. + /// Should call it from concrete DelegateProxy type, not generic. + public static func register(make: @escaping (Parent) -> Self) { + self.factory.extend(make: make) + } + + /// Creates new proxy for target object. + /// Should not call this function directory, use 'DelegateProxy.proxy(for:)' + public static func createProxy(for object: AnyObject) -> Self { + return castOrFatalError(factory.createProxy(for: object)) + } + /// Returns existing proxy for object or installs new instance of delegate proxy. /// /// - parameter object: Target object on which to install delegate proxy. @@ -143,8 +171,8 @@ extension DelegateProxyType { /// /// extension Reactive where Base: UISearchBar { /// - /// public var delegate: DelegateProxy { - /// return RxSearchBarDelegateProxy.proxyForObject(base) + /// public var delegate: DelegateProxy { + /// return RxSearchBarDelegateProxy.proxy(for: base) /// } /// /// public var text: ControlProperty { @@ -152,32 +180,32 @@ extension DelegateProxyType { /// ... /// } /// } - public static func proxyForObject(_ object: AnyObject) -> Self { + public static func proxy(for object: ParentObject) -> Self { MainScheduler.ensureExecutingOnScheduler() - let maybeProxy = Self.assignedProxyFor(object) as? Self + let maybeProxy = self.assignedProxy(for: object) - let proxy: Self + let proxy: AnyObject if let existingProxy = maybeProxy { proxy = existingProxy } else { - proxy = Self.createProxyForObject(object) as! Self - Self.assignProxy(proxy, toObject: object) - assert(Self.assignedProxyFor(object) === proxy) + proxy = castOrFatalError(self.createProxy(for: object)) + self.assignProxy(proxy, toObject: object) + assert(self.assignedProxy(for: object) === proxy) } - - let currentDelegate: AnyObject? = Self.currentDelegateFor(object) - - if currentDelegate !== proxy { - proxy.setForwardToDelegate(currentDelegate, retainDelegate: false) - assert(proxy.forwardToDelegate() === currentDelegate) - Self.setCurrentDelegate(proxy, toObject: object) - assert(Self.currentDelegateFor(object) === proxy) - assert(proxy.forwardToDelegate() === currentDelegate) + let currentDelegate = self._currentDelegate(for: object) + let delegateProxy: Self = castOrFatalError(proxy) + + if currentDelegate !== delegateProxy { + delegateProxy._setForwardToDelegate(currentDelegate, retainDelegate: false) + assert(delegateProxy._forwardToDelegate() === currentDelegate) + self._setCurrentDelegate(proxy, to: object) + assert(self._currentDelegate(for: object) === proxy) + assert(delegateProxy._forwardToDelegate() === currentDelegate) } - return proxy + return delegateProxy } /// Sets forward delegate for `DelegateProxyType` associated with a specific object and return disposable that can be used to unset the forward to delegate. @@ -187,46 +215,102 @@ extension DelegateProxyType { /// - parameter retainDelegate: Retain `forwardDelegate` while it's being set. /// - parameter onProxyForObject: Object that has `delegate` property. /// - returns: Disposable object that can be used to clear forward delegate. - public static func installForwardDelegate(_ forwardDelegate: AnyObject, retainDelegate: Bool, onProxyForObject object: AnyObject) -> Disposable { - weak var weakForwardDelegate: AnyObject? = forwardDelegate + public static func installForwardDelegate(_ forwardDelegate: Delegate, retainDelegate: Bool, onProxyForObject object: ParentObject) -> Disposable { + weak var weakForwardDelegate: AnyObject? = forwardDelegate as AnyObject + let proxy = self.proxy(for: object) - let proxy = Self.proxyForObject(object) - - assert(proxy.forwardToDelegate() === nil, "This is a feature to warn you that there is already a delegate (or data source) set somewhere previously. The action you are trying to perform will clear that delegate (data source) and that means that some of your features that depend on that delegate (data source) being set will likely stop working.\n" + + assert(proxy._forwardToDelegate() === nil, "This is a feature to warn you that there is already a delegate (or data source) set somewhere previously. The action you are trying to perform will clear that delegate (data source) and that means that some of your features that depend on that delegate (data source) being set will likely stop working.\n" + "If you are ok with this, try to set delegate (data source) to `nil` in front of this operation.\n" + " This is the source object value: \(object)\n" + " This this the original delegate (data source) value: \(proxy.forwardToDelegate()!)\n" + "Hint: Maybe delegate was already set in xib or storyboard and now it's being overwritten in code.\n") proxy.setForwardToDelegate(forwardDelegate, retainDelegate: retainDelegate) - + return Disposables.create { MainScheduler.ensureExecutingOnScheduler() - + let delegate: AnyObject? = weakForwardDelegate - - assert(delegate == nil || proxy.forwardToDelegate() === delegate, "Delegate was changed from time it was first set. Current \(String(describing: proxy.forwardToDelegate())), and it should have been \(proxy)") - + + assert(delegate == nil || proxy._forwardToDelegate() === delegate, "Delegate was changed from time it was first set. Current \(String(describing: proxy.forwardToDelegate())), and it should have been \(proxy)") + proxy.setForwardToDelegate(nil, retainDelegate: retainDelegate) } } } + +// fileprivate extensions +extension DelegateProxyType { + fileprivate static var factory: DelegateProxyFactory { + return DelegateProxyFactory.sharedFactory(for: self) + } + + fileprivate static func assignedProxy(for object: ParentObject) -> AnyObject? { + let maybeDelegate = objc_getAssociatedObject(object, self.identifier) + return castOptionalOrFatalError(maybeDelegate) + } + + fileprivate static func assignProxy(_ proxy: AnyObject, toObject object: ParentObject) { + objc_setAssociatedObject(object, self.identifier, proxy, .OBJC_ASSOCIATION_RETAIN) + } +} + +/// Describes an object that has a delegate. +public protocol HasDelegate: AnyObject { + /// Delegate type + associatedtype Delegate + + /// Delegate + var delegate: Delegate? { get set } +} + +extension DelegateProxyType where ParentObject: HasDelegate, Self.Delegate == ParentObject.Delegate { + public static func currentDelegate(for object: ParentObject) -> Delegate? { + return object.delegate + } + + public static func setCurrentDelegate(_ delegate: Delegate?, to object: ParentObject) { + object.delegate = delegate + } +} + +/// Describes an object that has a data source. +public protocol HasDataSource: AnyObject { + /// Data source type + associatedtype DataSource + + /// Data source + var dataSource: DataSource? { get set } +} + +extension DelegateProxyType where ParentObject: HasDataSource, Self.Delegate == ParentObject.DataSource { + public static func currentDelegate(for object: ParentObject) -> Delegate? { + return object.dataSource + } + + public static func setCurrentDelegate(_ delegate: Delegate?, to object: ParentObject) { + object.dataSource = delegate + } +} + #if os(iOS) || os(tvOS) import UIKit extension ObservableType { - func subscribeProxyDataSource(ofObject object: UIView, dataSource: AnyObject, retainDataSource: Bool, binding: @escaping (P, Event) -> Void) - -> Disposable { - let proxy = P.proxyForObject(object) - let unregisterDelegate = P.installForwardDelegate(dataSource, retainDelegate: retainDataSource, onProxyForObject: object) + func subscribeProxyDataSource(ofObject object: DelegateProxy.ParentObject, dataSource: DelegateProxy.Delegate, retainDataSource: Bool, binding: @escaping (DelegateProxy, Event) -> Void) + -> Disposable + where DelegateProxy.ParentObject: UIView + , DelegateProxy.Delegate: AnyObject { + let proxy = DelegateProxy.proxy(for: object) + let unregisterDelegate = DelegateProxy.installForwardDelegate(dataSource, retainDelegate: retainDataSource, onProxyForObject: object) // this is needed to flush any delayed old state (https://github.com/RxSwiftCommunity/RxDataSources/pull/75) object.layoutIfNeeded() let subscription = self.asObservable() .observeOn(MainScheduler()) .catchError { error in - bindingErrorToInterface(error) + bindingError(error) return Observable.empty() } // source can never end, otherwise it would release the subscriber, and deallocate the data source @@ -235,14 +319,14 @@ extension DelegateProxyType { .subscribe { [weak object] (event: Event) in if let object = object { - assert(proxy === P.currentDelegateFor(object), "Proxy changed from the time it was first set.\nOriginal: \(proxy)\nExisting: \(String(describing: P.currentDelegateFor(object)))") + assert(proxy === DelegateProxy.currentDelegate(for: object), "Proxy changed from the time it was first set.\nOriginal: \(proxy)\nExisting: \(String(describing: DelegateProxy.currentDelegate(for: object)))") } binding(proxy, event) switch event { case .error(let error): - bindingErrorToInterface(error) + bindingError(error) unregisterDelegate.dispose() case .completed: unregisterDelegate.dispose() @@ -261,4 +345,64 @@ extension DelegateProxyType { #endif + /** + + To add delegate proxy subclasses call `DelegateProxySubclass.register()` in `registerKnownImplementations` or in some other + part of your app that executes before using `rx.*` (e.g. appDidFinishLaunching). + + class RxScrollViewDelegateProxy: DelegateProxy { + public static func registerKnownImplementations() { + self.register { RxTableViewDelegateProxy(parentObject: $0) } + } + ... + + + */ + private class DelegateProxyFactory { + private static var _sharedFactories: [UnsafeRawPointer: DelegateProxyFactory] = [:] + + fileprivate static func sharedFactory(for proxyType: DelegateProxy.Type) -> DelegateProxyFactory { + MainScheduler.ensureExecutingOnScheduler() + let identifier = DelegateProxy.identifier + if let factory = _sharedFactories[identifier] { + return factory + } + let factory = DelegateProxyFactory(for: proxyType) + _sharedFactories[identifier] = factory + DelegateProxy.registerKnownImplementations() + return factory + } + + private var _factories: [ObjectIdentifier: ((AnyObject) -> AnyObject)] + private var _delegateProxyType: Any.Type + private var _identifier: UnsafeRawPointer + + private init(for proxyType: DelegateProxy.Type) { + _factories = [:] + _delegateProxyType = proxyType + _identifier = proxyType.identifier + } + + fileprivate func extend(make: @escaping (ParentObject) -> DelegateProxy) { + MainScheduler.ensureExecutingOnScheduler() + precondition(_identifier == DelegateProxy.identifier, "Delegate proxy has inconsistent identifier") + guard _factories[ObjectIdentifier(ParentObject.self)] == nil else { + rxFatalError("The factory of \(ParentObject.self) is duplicated. DelegateProxy is not allowed of duplicated base object type.") + } + _factories[ObjectIdentifier(ParentObject.self)] = { make(castOrFatalError($0)) } + } + + fileprivate func createProxy(for object: AnyObject) -> AnyObject { + MainScheduler.ensureExecutingOnScheduler() + var maybeMirror: Mirror? = Mirror(reflecting: object) + while let mirror = maybeMirror { + if let factory = _factories[ObjectIdentifier(mirror.subjectType)] { + return factory(object) + } + maybeMirror = mirror.superclassMirror + } + rxFatalError("DelegateProxy has no factory of \(object). Implement DelegateProxy subclass for \(object) first.") + } + } + #endif diff --git a/Pods/RxCocoa/RxCocoa/Common/NSLayoutConstraint+Rx.swift b/Pods/RxCocoa/RxCocoa/Common/NSLayoutConstraint+Rx.swift index 8dfa956e..5810fe55 100644 --- a/Pods/RxCocoa/RxCocoa/Common/NSLayoutConstraint+Rx.swift +++ b/Pods/RxCocoa/RxCocoa/Common/NSLayoutConstraint+Rx.swift @@ -9,28 +9,26 @@ #if !os(Linux) #if os(macOS) -import Cocoa + import Cocoa #else -import UIKit + import UIKit #endif -#if !RX_NO_MODULE import RxSwift -#endif #if os(iOS) || os(macOS) || os(tvOS) extension Reactive where Base: NSLayoutConstraint { /// Bindable sink for `constant` property. - public var constant: UIBindingObserver { - return UIBindingObserver(UIElement: self.base) { constraint, constant in + public var constant: Binder { + return Binder(self.base) { constraint, constant in constraint.constant = constant } } /// Bindable sink for `active` property. @available(iOS 8, OSX 10.10, *) - public var active: UIBindingObserver { - return UIBindingObserver(UIElement: self.base) { constraint, value in + public var active: Binder { + return Binder(self.base) { constraint, value in constraint.isActive = value } } diff --git a/Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift b/Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift index 79184445..4cca12b4 100644 --- a/Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift +++ b/Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift @@ -6,9 +6,8 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE - import RxSwift -#endif + +import RxSwift extension ObservableType { @@ -39,43 +38,73 @@ extension ObservableType { } /** - Creates new subscription and sends elements to variable. - - In case error occurs in debug mode, `fatalError` will be raised. - In case error occurs in release mode, `error` will be logged. - - - parameter to: Target variable for sequence elements. - - returns: Disposable object that can be used to unsubscribe the observer. - */ - public func bind(to variable: Variable) -> Disposable { + Creates new subscription and sends elements to publish relay. + + In case error occurs in debug mode, `fatalError` will be raised. + In case error occurs in release mode, `error` will be logged. + + - parameter to: Target publish relay for sequence elements. + - returns: Disposable object that can be used to unsubscribe the observer. + */ + public func bind(to relay: PublishRelay) -> Disposable { return subscribe { e in switch e { case let .next(element): - variable.value = element + relay.accept(element) case let .error(error): - let error = "Binding error to variable: \(error)" - #if DEBUG - rxFatalError(error) - #else - print(error) - #endif + rxFatalErrorInDebug("Binding error to publish relay: \(error)") case .completed: break } } } - + /** - Creates new subscription and sends elements to variable. - + Creates new subscription and sends elements to publish relay. + In case error occurs in debug mode, `fatalError` will be raised. In case error occurs in release mode, `error` will be logged. - - - parameter to: Target variable for sequence elements. + + - parameter to: Target publish relay for sequence elements. + - returns: Disposable object that can be used to unsubscribe the observer. + */ + public func bind(to relay: PublishRelay) -> Disposable { + return self.map { $0 as E? }.bind(to: relay) + } + + /** + Creates new subscription and sends elements to behavior relay. + + In case error occurs in debug mode, `fatalError` will be raised. + In case error occurs in release mode, `error` will be logged. + + - parameter to: Target behavior relay for sequence elements. + - returns: Disposable object that can be used to unsubscribe the observer. + */ + public func bind(to relay: BehaviorRelay) -> Disposable { + return subscribe { e in + switch e { + case let .next(element): + relay.accept(element) + case let .error(error): + rxFatalErrorInDebug("Binding error to behavior relay: \(error)") + case .completed: + break + } + } + } + + /** + Creates new subscription and sends elements to behavior relay. + + In case error occurs in debug mode, `fatalError` will be raised. + In case error occurs in release mode, `error` will be logged. + + - parameter to: Target behavior relay for sequence elements. - returns: Disposable object that can be used to unsubscribe the observer. */ - public func bind(to variable: Variable) -> Disposable { - return self.map { $0 as E? }.bind(to: variable) + public func bind(to relay: BehaviorRelay) -> Disposable { + return self.map { $0 as E? }.bind(to: relay) } /** @@ -116,12 +145,7 @@ extension ObservableType { */ public func bind(onNext: @escaping (E) -> Void) -> Disposable { return subscribe(onNext: onNext, onError: { error in - let error = "Binding error: \(error)" - #if DEBUG - rxFatalError(error) - #else - print(error) - #endif + rxFatalErrorInDebug("Binding error: \(error)") }) } } diff --git a/Pods/RxCocoa/RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift b/Pods/RxCocoa/RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift index 529694bf..5a1af717 100644 --- a/Pods/RxCocoa/RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift +++ b/Pods/RxCocoa/RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift @@ -6,10 +6,8 @@ // Copyright © 2016 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE - #if SWIFT_PACKAGE && !DISABLE_SWIZZLING && !os(Linux) - import RxCocoaRuntime - #endif +#if SWIFT_PACKAGE && !DISABLE_SWIZZLING && !os(Linux) + import RxCocoaRuntime #endif #if !DISABLE_SWIZZLING && !os(Linux) diff --git a/Pods/RxCocoa/RxCocoa/Common/RxTarget.swift b/Pods/RxCocoa/RxCocoa/Common/RxTarget.swift index da1086df..94cc1a1b 100644 --- a/Pods/RxCocoa/RxCocoa/Common/RxTarget.swift +++ b/Pods/RxCocoa/RxCocoa/Common/RxTarget.swift @@ -8,9 +8,7 @@ import class Foundation.NSObject -#if !RX_NO_MODULE import RxSwift -#endif class RxTarget : NSObject , Disposable { diff --git a/Pods/RxCocoa/RxCocoa/Common/TextInput.swift b/Pods/RxCocoa/RxCocoa/Common/TextInput.swift index 7fd62bde..6fc7a29f 100644 --- a/Pods/RxCocoa/RxCocoa/Common/TextInput.swift +++ b/Pods/RxCocoa/RxCocoa/Common/TextInput.swift @@ -6,9 +6,7 @@ // Copyright © 2016 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE - import RxSwift -#endif +import RxSwift #if os(iOS) || os(tvOS) import UIKit diff --git a/Pods/RxCocoa/RxCocoa/Deprecated.swift b/Pods/RxCocoa/RxCocoa/Deprecated.swift index d4b4ae0e..fb929c60 100644 --- a/Pods/RxCocoa/RxCocoa/Deprecated.swift +++ b/Pods/RxCocoa/RxCocoa/Deprecated.swift @@ -6,9 +6,8 @@ // Copyright © 2017 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE - import RxSwift -#endif +import RxSwift +import Dispatch extension ObservableType { @@ -132,3 +131,359 @@ extension ObservableType { }) } } + +#if os(iOS) || os(tvOS) + import UIKit + + extension NSTextStorage { + @available(*, unavailable, message: "createRxDelegateProxy is now unavailable, check DelegateProxyFactory") + public func createRxDelegateProxy() -> RxTextStorageDelegateProxy { + fatalError() + } + } + + extension UIScrollView { + @available(*, unavailable, message: "createRxDelegateProxy is now unavailable, check DelegateProxyFactory") + public func createRxDelegateProxy() -> RxScrollViewDelegateProxy { + fatalError() + } + } + + extension UICollectionView { + @available(*, unavailable, message: "createRxDataSourceProxy is now unavailable, check DelegateProxyFactory") + public func createRxDataSourceProxy() -> RxCollectionViewDataSourceProxy { + fatalError() + } + } + + extension UITableView { + @available(*, unavailable, message: "createRxDataSourceProxy is now unavailable, check DelegateProxyFactory") + public func createRxDataSourceProxy() -> RxTableViewDataSourceProxy { + fatalError() + } + } + + extension UINavigationBar { + @available(*, unavailable, message: "createRxDelegateProxy is now unavailable, check DelegateProxyFactory") + public func createRxDelegateProxy() -> RxNavigationControllerDelegateProxy { + fatalError() + } + } + + extension UINavigationController { + @available(*, unavailable, message: "createRxDelegateProxy is now unavailable, check DelegateProxyFactory") + public func createRxDelegateProxy() -> RxNavigationControllerDelegateProxy { + fatalError() + } + } + + extension UITabBar { + @available(*, unavailable, message: "createRxDelegateProxy is now unavailable, check DelegateProxyFactory") + public func createRxDelegateProxy() -> RxTabBarDelegateProxy { + fatalError() + } + } + + extension UITabBarController { + @available(*, unavailable, message: "createRxDelegateProxy is now unavailable, check DelegateProxyFactory") + public func createRxDelegateProxy() -> RxTabBarControllerDelegateProxy { + fatalError() + } + } + + extension UISearchBar { + @available(*, unavailable, message: "createRxDelegateProxy is now unavailable, check DelegateProxyFactory") + public func createRxDelegateProxy() -> RxSearchBarDelegateProxy { + fatalError() + } + } + +#endif + +#if os(iOS) + extension UISearchController { + @available(*, unavailable, message: "createRxDelegateProxy is now unavailable, check DelegateProxyFactory") + public func createRxDelegateProxy() -> RxSearchControllerDelegateProxy { + fatalError() + } + } + + extension UIPickerView { + @available(*, unavailable, message: "createRxDelegateProxy is now unavailable, check DelegateProxyFactory") + public func createRxDelegateProxy() -> RxPickerViewDelegateProxy { + fatalError() + } + + @available(*, unavailable, message: "createRxDataSourceProxy is now unavailable, check DelegateProxyFactory") + public func createRxDataSourceProxy() -> RxPickerViewDataSourceProxy { + fatalError() + } + } + extension UIWebView { + @available(*, unavailable, message: "createRxDelegateProxy is now unavailable, check DelegateProxyFactory") + public func createRxDelegateProxy() -> RxWebViewDelegateProxy { + fatalError() + } + } +#endif + +#if os(macOS) + import Cocoa + + extension NSTextField { + @available(*, unavailable, message: "createRxDelegateProxy is now unavailable, check DelegateProxyFactory") + public func createRxDelegateProxy() -> RxTextFieldDelegateProxy { + fatalError() + } + } +#endif + +/** + This method can be used in unit tests to ensure that driver is using mock schedulers instead of + main schedulers. + + **This shouldn't be used in normal release builds.** + */ +@available(*, deprecated, renamed: "SharingScheduler.mock(scheduler:action:)") +public func driveOnScheduler(_ scheduler: SchedulerType, action: () -> ()) { + SharingScheduler.mock(scheduler: scheduler, action: action) +} + +extension Variable { + /// Converts `Variable` to `SharedSequence` unit. + /// + /// - returns: Observable sequence. + @available(*, deprecated, renamed: "asDriver()") + public func asSharedSequence(strategy: SharingStrategy.Type = SharingStrategy.self) -> SharedSequence { + let source = self.asObservable() + .observeOn(SharingStrategy.scheduler) + return SharedSequence(source) + } +} + +#if !os(Linux) + +extension DelegateProxy { + @available(*, unavailable, renamed: "assignedProxy(for:)") + public static func assignedProxyFor(_ object: ParentObject) -> Delegate? { + fatalError() + } + + @available(*, unavailable, renamed: "currentDelegate(for:)") + public static func currentDelegateFor(_ object: ParentObject) -> Delegate? { + fatalError() + } +} + +#endif + +/** +Observer that enforces interface binding rules: + * can't bind errors (in debug builds binding of errors causes `fatalError` in release builds errors are being logged) + * ensures binding is performed on main thread + +`UIBindingObserver` doesn't retain target interface and in case owned interface element is released, element isn't bound. + + In case event binding is attempted from non main dispatch queue, event binding will be dispatched async to main dispatch + queue. +*/ +@available(*, deprecated, renamed: "Binder") +public final class UIBindingObserver : ObserverType where UIElementType: AnyObject { + public typealias E = Value + + weak var UIElement: UIElementType? + + let binding: (UIElementType, Value) -> Void + + /// Initializes `ViewBindingObserver` using + @available(*, deprecated, renamed: "UIBinder.init(_:scheduler:binding:)") + public init(UIElement: UIElementType, binding: @escaping (UIElementType, Value) -> Void) { + self.UIElement = UIElement + self.binding = binding + } + + /// Binds next element to owner view as described in `binding`. + public func on(_ event: Event) { + if !DispatchQueue.isMain { + DispatchQueue.main.async { + self.on(event) + } + return + } + + switch event { + case .next(let element): + if let view = self.UIElement { + binding(view, element) + } + case .error(let error): + bindingError(error) + case .completed: + break + } + } + + /// Erases type of observer. + /// + /// - returns: type erased observer. + public func asObserver() -> AnyObserver { + return AnyObserver(eventHandler: on) + } +} + + +#if os(iOS) + extension Reactive where Base: UIRefreshControl { + + /// Bindable sink for `beginRefreshing()`, `endRefreshing()` methods. + @available(*, deprecated, renamed: "isRefreshing") + public var refreshing: Binder { + return self.isRefreshing + } + } +#endif + +#if os(iOS) || os(tvOS) +extension Reactive where Base: UIImageView { + + /// Bindable sink for `image` property. + /// - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...) + @available(*, deprecated, renamed: "image") + public func image(transitionType: String? = nil) -> Binder { + return Binder(base) { imageView, image in + if let transitionType = transitionType { + if image != nil { + let transition = CATransition() + transition.duration = 0.25 + transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) + transition.type = transitionType + imageView.layer.add(transition, forKey: kCATransition) + } + } + else { + imageView.layer.removeAllAnimations() + } + imageView.image = image + } + } +} +#endif + +#if os(macOS) + + extension Reactive where Base: NSImageView { + + /// Bindable sink for `image` property. + /// + /// - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...) + @available(*, deprecated, renamed: "image") + public func image(transitionType: String? = nil) -> Binder { + return Binder(self.base) { control, value in + if let transitionType = transitionType { + if value != nil { + let transition = CATransition() + transition.duration = 0.25 + transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) + transition.type = transitionType + control.layer?.add(transition, forKey: kCATransition) + } + } + else { + control.layer?.removeAllAnimations() + } + control.image = value + } + } + } +#endif + +import RxSwift + +extension Variable { + /// Converts `Variable` to `Driver` trait. + /// + /// - returns: Driving observable sequence. + public func asDriver() -> Driver { + let source = self.asObservable() + .observeOn(DriverSharingStrategy.scheduler) + return Driver(source) + } +} + + +private let errorMessage = "`drive*` family of methods can be only called from `MainThread`.\n" + +"This is required to ensure that the last replayed `Driver` element is delivered on `MainThread`.\n" + +extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy { + /** + Creates new subscription and sends elements to variable. + This method can be only called from `MainThread`. + + - parameter variable: Target variable for sequence elements. + - returns: Disposable object that can be used to unsubscribe the observer from the variable. + */ + public func drive(_ variable: Variable) -> Disposable { + MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage) + return drive(onNext: { e in + variable.value = e + }) + } + + /** + Creates new subscription and sends elements to variable. + This method can be only called from `MainThread`. + + - parameter variable: Target variable for sequence elements. + - returns: Disposable object that can be used to unsubscribe the observer from the variable. + */ + public func drive(_ variable: Variable) -> Disposable { + MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage) + return drive(onNext: { e in + variable.value = e + }) + } +} + +extension ObservableType { + /** + Creates new subscription and sends elements to variable. + + In case error occurs in debug mode, `fatalError` will be raised. + In case error occurs in release mode, `error` will be logged. + + - parameter to: Target variable for sequence elements. + - returns: Disposable object that can be used to unsubscribe the observer. + */ + public func bind(to variable: Variable) -> Disposable { + return subscribe { e in + switch e { + case let .next(element): + variable.value = element + case let .error(error): + let error = "Binding error to variable: \(error)" + #if DEBUG + rxFatalError(error) + #else + print(error) + #endif + case .completed: + break + } + } + } + + /** + Creates new subscription and sends elements to variable. + + In case error occurs in debug mode, `fatalError` will be raised. + In case error occurs in release mode, `error` will be logged. + + - parameter to: Target variable for sequence elements. + - returns: Disposable object that can be used to unsubscribe the observer. + */ + public func bind(to variable: Variable) -> Disposable { + return self.map { $0 as E? }.bind(to: variable) + } +} + + diff --git a/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift b/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift index c101d664..f8746db3 100644 --- a/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift +++ b/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift @@ -8,21 +8,19 @@ #if !os(Linux) -#if !RX_NO_MODULE - import RxSwift -#endif - import CoreGraphics +import RxSwift +import CoreGraphics - import class Foundation.NSValue +import class Foundation.NSValue #if arch(x86_64) || arch(arm64) -let CGRectType = "{CGRect={CGPoint=dd}{CGSize=dd}}" -let CGSizeType = "{CGSize=dd}" -let CGPointType = "{CGPoint=dd}" + let CGRectType = "{CGRect={CGPoint=dd}{CGSize=dd}}" + let CGSizeType = "{CGSize=dd}" + let CGPointType = "{CGPoint=dd}" #elseif arch(i386) || arch(arm) -let CGRectType = "{CGRect={CGPoint=ff}{CGSize=ff}}" -let CGSizeType = "{CGSize=ff}" -let CGPointType = "{CGPoint=ff}" + let CGRectType = "{CGRect={CGPoint=ff}{CGSize=ff}}" + let CGSizeType = "{CGSize=ff}" + let CGPointType = "{CGPoint=ff}" #endif extension CGRect : KVORepresentable { diff --git a/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift b/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift index 93f2a746..8fc78c78 100644 --- a/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift +++ b/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift @@ -9,9 +9,22 @@ #if !os(Linux) import Foundation.NSObject -#if !RX_NO_MODULE - import RxSwift -#endif +import RxSwift + +/// Key value observing options +public struct KeyValueObservingOptions: OptionSet { + /// Raw value + public let rawValue: UInt + + public init(rawValue: UInt) { + self.rawValue = rawValue + } + + /// Whether a sequence element should be sent to the observer immediately, before the subscribe method even returns. + public static let initial = KeyValueObservingOptions(rawValue: 1 << 0) + /// Whether to send updated values. + public static let new = KeyValueObservingOptions(rawValue: 1 << 1) +} extension Reactive where Base: NSObject { @@ -23,7 +36,7 @@ extension Reactive where Base: NSObject { For more information take a look at `observe` method. */ - public func observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable { + public func observe(_ type: E.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable { return observe(E.KVOType.self, keyPath, options: options, retainSelf: retainSelf) .map(E.init) } @@ -37,7 +50,7 @@ extension Reactive where Base: NSObject { For more information take a look at `observeWeakly` method. */ - public func observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable { + public func observeWeakly(_ type: E.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial]) -> Observable { return observeWeakly(E.KVOType.self, keyPath, options: options) .map(E.init) } diff --git a/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift b/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift index 63449ce0..7a874bf2 100644 --- a/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift +++ b/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift @@ -8,10 +8,9 @@ #if !os(Linux) +import RxSwift + import Foundation.NSObject -#if !RX_NO_MODULE - import RxSwift -#endif extension Reactive where Base: NSObject { /** @@ -23,7 +22,7 @@ extension Reactive where Base: NSObject { For more information take a look at `observe` method. */ - public func observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable where E.RawValue: KVORepresentable { + public func observe(_ type: E.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable where E.RawValue: KVORepresentable { return observe(E.RawValue.KVOType.self, keyPath, options: options, retainSelf: retainSelf) .map(E.init) } @@ -43,7 +42,7 @@ extension Reactive where Base: NSObject { For more information take a look at `observeWeakly` method. */ - public func observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable where E.RawValue: KVORepresentable { + public func observeWeakly(_ type: E.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial]) -> Observable where E.RawValue: KVORepresentable { return observeWeakly(E.RawValue.KVOType.self, keyPath, options: options) .map(E.init) } diff --git a/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift b/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift index 9330c9b1..210b2dc8 100644 --- a/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift +++ b/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift @@ -9,11 +9,9 @@ #if !os(Linux) import Foundation.NSObject -#if !RX_NO_MODULE - import RxSwift - #if SWIFT_PACKAGE && !DISABLE_SWIZZLING && !os(Linux) - import RxCocoaRuntime - #endif +import RxSwift +#if SWIFT_PACKAGE && !DISABLE_SWIZZLING && !os(Linux) + import RxCocoaRuntime #endif #if !DISABLE_SWIZZLING && !os(Linux) @@ -65,7 +63,7 @@ extension Reactive where Base: NSObject { - parameter retainSelf: Retains self during observation if set `true`. - returns: Observable sequence of objects on `keyPath`. */ - public func observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable { + public func observe(_ type: E.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable { return KVOObservable(object: base, keyPath: keyPath, options: options, retainTarget: retainSelf).asObservable() } } @@ -89,7 +87,7 @@ extension Reactive where Base: NSObject { - parameter options: KVO mechanism notification options. - returns: Observable sequence of objects on `keyPath`. */ - public func observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable { + public func observeWeakly(_ type: E.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial]) -> Observable { return observeWeaklyKeyPathFor(base, keyPath: keyPath, options: options) .map { n in return n as? E @@ -133,7 +131,7 @@ extension Reactive where Base: AnyObject { In case some argument is `nil`, instance of `NSNull()` will be sent. - - returns: Observable sequence of object deallocating events. + - returns: Observable sequence of arguments passed to `selector` method. */ public func sentMessage(_ selector: Selector) -> Observable<[Any]> { return synchronized { @@ -162,7 +160,7 @@ extension Reactive where Base: AnyObject { In case some argument is `nil`, instance of `NSNull()` will be sent. - - returns: Observable sequence of object deallocating events. + - returns: Observable sequence of arguments passed to `selector` method. */ public func methodInvoked(_ selector: Selector) -> Observable<[Any]> { return synchronized { @@ -270,7 +268,7 @@ extension Reactive where Base: AnyObject { } @objc func deallocating() -> Void { - messageSent.on(.next()) + messageSent.on(.next(())) } deinit { @@ -332,7 +330,7 @@ fileprivate protocol KVOObservableProtocol { var target: AnyObject { get } var keyPath: String { get } var retainTarget: Bool { get } - var options: NSKeyValueObservingOptions { get } + var options: KeyValueObservingOptions { get } } fileprivate final class KVOObserver @@ -347,7 +345,7 @@ fileprivate final class KVOObserver _ = Resources.incrementTotal() #endif - super.init(target: parent.target, retainTarget: parent.retainTarget, keyPath: parent.keyPath, options: parent.options, callback: callback) + super.init(target: parent.target, retainTarget: parent.retainTarget, keyPath: parent.keyPath, options: parent.options.nsOptions, callback: callback) self.retainSelf = self } @@ -372,10 +370,10 @@ fileprivate final class KVOObservable var strongTarget: AnyObject? var keyPath: String - var options: NSKeyValueObservingOptions + var options: KeyValueObservingOptions var retainTarget: Bool - init(object: AnyObject, keyPath: String, options: NSKeyValueObservingOptions, retainTarget: Bool) { + init(object: AnyObject, keyPath: String, options: KeyValueObservingOptions, retainTarget: Bool) { self.target = object self.keyPath = keyPath self.options = options @@ -403,7 +401,7 @@ fileprivate final class KVOObservable #if !DISABLE_SWIZZLING && !os(Linux) - fileprivate func observeWeaklyKeyPathFor(_ target: NSObject, keyPath: String, options: NSKeyValueObservingOptions) -> Observable { + fileprivate func observeWeaklyKeyPathFor(_ target: NSObject, keyPath: String, options: KeyValueObservingOptions) -> Observable { let components = keyPath.components(separatedBy: ".").filter { $0 != "self" } let observable = observeWeaklyKeyPathFor(target, keyPathSections: components, options: options) @@ -440,10 +438,24 @@ fileprivate final class KVOObservable } } + fileprivate extension KeyValueObservingOptions { + fileprivate var nsOptions: NSKeyValueObservingOptions { + var result: UInt = 0 + if self.contains(.new) { + result |= NSKeyValueObservingOptions.new.rawValue + } + if self.contains(.initial) { + result |= NSKeyValueObservingOptions.initial.rawValue + } + + return NSKeyValueObservingOptions(rawValue: result) + } + } + fileprivate func observeWeaklyKeyPathFor( _ target: NSObject, keyPathSections: [String], - options: NSKeyValueObservingOptions + options: KeyValueObservingOptions ) -> Observable { weak var weakTarget: AnyObject? = target @@ -455,7 +467,7 @@ fileprivate final class KVOObservable if property == nil { return Observable.error(RxCocoaError.invalidPropertyName(object: target, propertyName: propertyName)) } - let propertyAttributes = property_getAttributes(property) + let propertyAttributes = property_getAttributes(property!) // should dealloc hook be in place if week property, or just create strong reference because it doesn't matter let isWeak = isWeakProperty(propertyAttributes.map(String.init) ?? "") diff --git a/Pods/RxCocoa/RxCocoa/Foundation/NotificationCenter+Rx.swift b/Pods/RxCocoa/RxCocoa/Foundation/NotificationCenter+Rx.swift index 883e973a..f15e7182 100644 --- a/Pods/RxCocoa/RxCocoa/Foundation/NotificationCenter+Rx.swift +++ b/Pods/RxCocoa/RxCocoa/Foundation/NotificationCenter+Rx.swift @@ -9,9 +9,7 @@ import class Foundation.NotificationCenter import struct Foundation.Notification -#if !RX_NO_MODULE import RxSwift -#endif extension Reactive where Base: NotificationCenter { /** diff --git a/Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift b/Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift index 2f21fcac..26bc61b9 100644 --- a/Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift +++ b/Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift @@ -24,9 +24,7 @@ import var Foundation.NSURLErrorDomain import Foundation #endif -#if !RX_NO_MODULE import RxSwift -#endif /// RxCocoa URL errors. public enum RxCocoaURLError @@ -123,7 +121,7 @@ extension Reactive where Base: URLSession { - parameter request: URL request. - returns: Observable sequence of URL responses. */ - public func response(request: URLRequest) -> Observable<(HTTPURLResponse, Data)> { + public func response(request: URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)> { return Observable.create { observer in // smart compiler should be able to optimize this out @@ -158,7 +156,7 @@ extension Reactive where Base: URLSession { return } - observer.on(.next(httpResponse, data)) + observer.on(.next((httpResponse, data))) observer.on(.completed) } @@ -184,12 +182,12 @@ extension Reactive where Base: URLSession { - returns: Observable sequence of response data. */ public func data(request: URLRequest) -> Observable { - return response(request: request).map { (response, data) -> Data in - if 200 ..< 300 ~= response.statusCode { - return data + return response(request: request).map { pair -> Data in + if 200 ..< 300 ~= pair.0.statusCode { + return pair.1 } else { - throw RxCocoaURLError.httpRequestFailed(response: response, data: data) + throw RxCocoaURLError.httpRequestFailed(response: pair.0, data: pair.1) } } } diff --git a/Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m b/Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m index 0a78e7a1..9cd58332 100644 --- a/Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m +++ b/Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m @@ -17,6 +17,8 @@ #if !DISABLE_SWIZZLING +#define NSErrorParam NSError *__autoreleasing __nullable * __nullable + // self + cmd #define HIDDEN_ARGUMENT_COUNT 2 @@ -31,7 +33,7 @@ typedef unsigned int rx_uint; typedef unsigned long rx_ulong; typedef id (^rx_block)(id); -typedef BOOL (^RXInterceptWithOptimizedObserver)(RXObjCRuntime * __nonnull self, Class __nonnull class, SEL __nonnull selector, NSError ** __nonnull error); +typedef BOOL (^RXInterceptWithOptimizedObserver)(RXObjCRuntime * __nonnull self, Class __nonnull class, SEL __nonnull selector, NSErrorParam error); static CFTypeID defaultTypeID; static SEL deallocSelector; @@ -75,7 +77,7 @@ { .encoding = @encode(void)}, { .encoding = @encode(id)}, { .encoding = @encode(Class)}, - { .encoding = @encode(void (^)())}, + { .encoding = @encode(void (^)(void))}, { .encoding = @encode(char)}, { .encoding = @encode(short)}, { .encoding = @encode(int)}, @@ -153,7 +155,7 @@ id __nonnull RX_extract_argument_at_index(NSInvocation * __nonnull invocation, N if (strcmp(argumentType, @encode(id)) == 0 || strcmp(argumentType, @encode(Class)) == 0 - || strcmp(argumentType, @encode(void (^)())) == 0 + || strcmp(argumentType, @encode(void (^)(void))) == 0 ) { __unsafe_unretained id argument = nil; [invocation getArgument:&argument atIndex:index]; @@ -272,12 +274,12 @@ @interface RXObjCRuntime: NSObject +(RXObjCRuntime*)instance; -(void)performLocked:(void (^)(RXObjCRuntime* __nonnull))action; --(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull)selector error:(NSError** __nonnull)error; +-(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull)selector error:(NSErrorParam)error; -(BOOL)ensureSwizzledSelector:(SEL __nonnull)selector ofClass:(Class __nonnull)class - newImplementationGenerator:(IMP(^)())newImplementationGenerator + newImplementationGenerator:(IMP(^)(void))newImplementationGenerator replacementImplementationGenerator:(IMP (^)(IMP originalImplementation))replacementImplementationGenerator - error:(NSError ** __nonnull)error; + error:(NSErrorParam)error; +(void)registerOptimizedObserver:(RXInterceptWithOptimizedObserver)registration encodedAs:(SEL)selector; @@ -288,7 +290,7 @@ +(void)registerOptimizedObserver:(RXInterceptWithOptimizedObserver)registration All API methods perform work on locked instance of `RXObjCRuntime`. In that way it's easy to prove that every action is properly locked. */ -IMP __nullable RX_ensure_observing(id __nonnull target, SEL __nonnull selector, NSError ** __nonnull error) { +IMP __nullable RX_ensure_observing(id __nonnull target, SEL __nonnull selector, NSErrorParam error) { __block IMP targetImplementation = nil; // Target is the second object that needs to be synchronized to TRY to make sure other swizzling framework // won't do something in parallel. @@ -313,7 +315,7 @@ IMP __nullable RX_ensure_observing(id __nonnull target, SEL __nonnull selector, return targetImplementation; } -IMP __nonnull RX_default_target_implementation() { +IMP __nonnull RX_default_target_implementation(void) { return _objc_msgForward; } @@ -376,7 +378,7 @@ IMP __nonnull RX_default_target_implementation() { #define GENERATE_OBSERVE_METHOD_DECLARATION(...) \ -(BOOL)GENERATE_METHOD_IDENTIFIER(__VA_ARGS__):(Class __nonnull)class \ selector:(SEL)selector \ - error:(NSError ** __nonnull)error { \ + error:(NSErrorParam)error { \ #define BUILD_EXAMPLE_METHOD(return_value, ...) \ @@ -396,7 +398,7 @@ +(return_value)RX_CAT2(RX_CAT2(example_, return_value), RX_FOREACH(_, SEPARATE_B +(void)load { \ __unused SEL exampleSelector = @selector(BUILD_EXAMPLE_METHOD_SELECTOR(return_value, ## __VA_ARGS__)); \ [self registerOptimizedObserver:^BOOL(RXObjCRuntime * __nonnull self, Class __nonnull class, \ - SEL __nonnull selector, NSError **__nonnull error) { \ + SEL __nonnull selector, NSErrorParam error) { \ return [self GENERATE_METHOD_IDENTIFIER(return_value, ## __VA_ARGS__):class selector:selector error:error]; \ } encodedAs:exampleSelector]; \ } \ @@ -408,9 +410,9 @@ +(void)load { #define NO_BODY(...) #define SWIZZLE_INFRASTRUCTURE_METHOD(return_value, method_name, parameters, method_selector, body, ...) \ - SWIZZLE_METHOD(return_value, -(BOOL)method_name:(Class __nonnull)class parameters error:(NSError **__nonnull)error \ + SWIZZLE_METHOD(return_value, -(BOOL)method_name:(Class __nonnull)class parameters error:(NSErrorParam)error \ { \ - SEL selector = method_selector; , body, NO_BODY, __VA_ARGS__) \ + SEL selector = method_selector; , body, NO_BODY, __VA_ARGS__) \ // common base @@ -418,7 +420,7 @@ +(void)load { #define SWIZZLE_METHOD(return_value, method_prototype, body, invoked_body, ...) \ method_prototype \ __unused SEL rxSelector = RX_selector(selector); \ - IMP (^newImplementationGenerator)() = ^() { \ + IMP (^newImplementationGenerator)(void) = ^() { \ __block IMP thisIMP = nil; \ id newImplementation = ^return_value(__unsafe_unretained id self DECLARE_ARGUMENTS(__VA_ARGS__)) { \ body(__VA_ARGS__) \ @@ -606,7 +608,7 @@ +(void)registerOptimizedObserver:(RXInterceptWithOptimizedObserver)registration /** This is the main entry point for observing messages sent to arbitrary objects. */ --(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull)selector error:(NSError** __nonnull)error { +-(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull)selector error:(NSErrorParam)error { Method instanceMethod = class_getInstanceMethod([target class], selector); if (instanceMethod == nil) { RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain @@ -700,7 +702,7 @@ -(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull userInfo:nil], nil); } --(Class __nullable)prepareTargetClassForObserving:(id __nonnull)target error:(NSError **__nonnull)error { +-(Class __nullable)prepareTargetClassForObserving:(id __nonnull)target error:(NSErrorParam)error { Class swizzlingClass = objc_getAssociatedObject(target, &RxSwizzlingTargetClassKey); if (swizzlingClass != nil) { return swizzlingClass; @@ -796,7 +798,7 @@ -(void)registerForwardedSelector:(SEL)selector forClass:(Class __nonnull)class { -(BOOL)observeByForwardingMessages:(Class __nonnull)swizzlingImplementorClass selector:(SEL)selector target:(id __nonnull)target - error:(NSError **__nonnull)error { + error:(NSErrorParam)error { if (![self ensureForwardingMethodsAreSwizzled:swizzlingImplementorClass error:error]) { return NO; } @@ -856,7 +858,7 @@ then dynamic subclass is created (only this instance will have performance hit). but to know when instance of a `NSString` was deallocated, performance hit will be only felt on a single instance of `NSString`, not all instances of `NSString`s. */ --(Class __nullable)ensureHasDynamicFakeSubclass:(Class __nonnull)class error:(NSError **)error { +-(Class __nullable)ensureHasDynamicFakeSubclass:(Class __nonnull)class error:(NSErrorParam)error { Class dynamicFakeSubclass = self.dynamicSubclassByRealClass[CLASS_VALUE(class)]; if (dynamicFakeSubclass != nil) { return dynamicFakeSubclass; @@ -879,7 +881,7 @@ -(Class __nullable)ensureHasDynamicFakeSubclass:(Class __nonnull)class error:(NS return dynamicFakeSubclass; } --(BOOL)ensureForwardingMethodsAreSwizzled:(Class __nonnull)class error:(NSError ** __nonnull)error { +-(BOOL)ensureForwardingMethodsAreSwizzled:(Class __nonnull)class error:(NSErrorParam)error { NSValue *classValue = CLASS_VALUE(class); if ([self.classesThatSupportObservingByForwarding containsObject:classValue]) { return YES; @@ -922,9 +924,9 @@ -(IMP)interceptorImplementationForSelector:(SEL)selector forClass:(Class)class { -(BOOL)ensureSwizzledSelector:(SEL __nonnull)selector ofClass:(Class __nonnull)class - newImplementationGenerator:(IMP(^)())newImplementationGenerator + newImplementationGenerator:(IMP(^)(void))newImplementationGenerator replacementImplementationGenerator:(IMP (^)(IMP originalImplementation))replacementImplementationGenerator - error:(NSError ** __nonnull)error { + error:(NSErrorParam)error { if ([self interceptorImplementationForSelector:selector forClass:class] != nil) { DLOG(@"Trying to register same intercept at least once, this sounds like a possible bug"); return YES; diff --git a/Pods/RxCocoa/RxCocoa/Runtime/include/_RXDelegateProxy.h b/Pods/RxCocoa/RxCocoa/Runtime/include/_RXDelegateProxy.h index f82d6128..e1cc207d 100644 --- a/Pods/RxCocoa/RxCocoa/Runtime/include/_RXDelegateProxy.h +++ b/Pods/RxCocoa/RxCocoa/Runtime/include/_RXDelegateProxy.h @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, weak, readonly) id _forwardToDelegate; --(void)_setForwardToDelegate:(id __nullable)forwardToDelegate retainDelegate:(BOOL)retainDelegate; +-(void)_setForwardToDelegate:(id __nullable)forwardToDelegate retainDelegate:(BOOL)retainDelegate NS_SWIFT_NAME(_setForwardToDelegate(_:retainDelegate:)) ; -(BOOL)hasWiredImplementationForSelector:(SEL)selector; -(BOOL)voidDelegateMethodsContain:(SEL)selector; diff --git a/Pods/RxCocoa/RxCocoa/Runtime/include/_RXObjCRuntime.h b/Pods/RxCocoa/RxCocoa/Runtime/include/_RXObjCRuntime.h index ca0d0253..9824a3b4 100644 --- a/Pods/RxCocoa/RxCocoa/Runtime/include/_RXObjCRuntime.h +++ b/Pods/RxCocoa/RxCocoa/Runtime/include/_RXObjCRuntime.h @@ -85,7 +85,7 @@ void * __nonnull RX_reference_from_selector(SEL __nonnull selector); @end /// Ensures interceptor is installed on target object. -IMP __nullable RX_ensure_observing(id __nonnull target, SEL __nonnull selector, NSError *__nullable * __nonnull error); +IMP __nullable RX_ensure_observing(id __nonnull target, SEL __nonnull selector, NSError *__autoreleasing __nullable * __nullable error); /// Extracts arguments for `invocation`. NSArray * __nonnull RX_extract_arguments(NSInvocation * __nonnull invocation); @@ -97,6 +97,6 @@ BOOL RX_is_method_with_description_void(struct objc_method_description method); BOOL RX_is_method_signature_void(NSMethodSignature * __nonnull methodSignature); /// Default value for `RXInterceptionObserver.targetImplementation`. -IMP __nonnull RX_default_target_implementation(); +IMP __nonnull RX_default_target_implementation(void); #endif diff --git a/Pods/RxCocoa/RxCocoa/RxCocoa.swift b/Pods/RxCocoa/RxCocoa/RxCocoa.swift index 95e6dfa2..78f8c98b 100644 --- a/Pods/RxCocoa/RxCocoa/RxCocoa.swift +++ b/Pods/RxCocoa/RxCocoa/RxCocoa.swift @@ -8,9 +8,7 @@ import class Foundation.NSNull -#if !RX_NO_MODULE import RxSwift -#endif #if os(iOS) import UIKit #endif @@ -64,8 +62,8 @@ extension RxCocoaError { // MARK: Error binding policies -func bindingErrorToInterface(_ error: Swift.Error) { - let error = "Binding error to UI: \(error)" +func bindingError(_ error: Swift.Error) { + let error = "Binding error: \(error)" #if DEBUG rxFatalError(error) #else @@ -147,11 +145,8 @@ let delegateNotSet = "Delegate not set" // MARK: Shared with RxSwift -#if !RX_NO_MODULE - func rxFatalError(_ lastMessage: String) -> Never { // The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours. fatalError(lastMessage) } -#endif diff --git a/Pods/RxCocoa/RxCocoa/Traits/BehaviorRelay.swift b/Pods/RxCocoa/RxCocoa/Traits/BehaviorRelay.swift new file mode 100644 index 00000000..b80b6da3 --- /dev/null +++ b/Pods/RxCocoa/RxCocoa/Traits/BehaviorRelay.swift @@ -0,0 +1,44 @@ +// +// BehaviorRelay.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 10/7/17. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +import RxSwift + +/// BehaviorRelay is a wrapper for `BehaviorSubject`. +/// +/// Unlike `BehaviorSubject` it can't terminate with error or completed. +public final class BehaviorRelay: ObservableType { + public typealias E = Element + + private let _subject: BehaviorSubject + + // Accepts `event` and emits it to subscribers + public func accept(_ event: Element) { + _subject.onNext(event) + } + + /// Current value of behavior subject + public var value: Element { + // this try! is ok because subject can't error out or be disposed + return try! _subject.value() + } + + /// Initializes variable with initial value. + public init(value: Element) { + _subject = BehaviorSubject(value: value) + } + + /// Subscribes observer + public func subscribe(_ observer: O) -> Disposable where O.E == E { + return _subject.subscribe(observer) + } + + /// - returns: Canonical interface for push style sequence + public func asObservable() -> Observable { + return _subject.asObservable() + } +} diff --git a/Pods/RxCocoa/RxCocoa/Traits/ControlEvent.swift b/Pods/RxCocoa/RxCocoa/Traits/ControlEvent.swift index e8d3d7cc..06a0f7b3 100644 --- a/Pods/RxCocoa/RxCocoa/Traits/ControlEvent.swift +++ b/Pods/RxCocoa/RxCocoa/Traits/ControlEvent.swift @@ -6,9 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE import RxSwift -#endif /// Protocol that enables extension of `ControlEvent`. public protocol ControlEventType : ObservableType { @@ -36,7 +34,7 @@ public protocol ControlEventType : ObservableType { **If they aren't, then using this trait communicates wrong properties and could potentially break someone's code.** **In case `events` observable sequence that is being passed into initializer doesn't satisfy all enumerated - properties, please don't use this unit.** + properties, please don't use this trait.** */ public struct ControlEvent : ControlEventType { public typealias E = PropertyType diff --git a/Pods/RxCocoa/RxCocoa/Traits/ControlProperty.swift b/Pods/RxCocoa/RxCocoa/Traits/ControlProperty.swift index cdac1ab9..821c46d7 100644 --- a/Pods/RxCocoa/RxCocoa/Traits/ControlProperty.swift +++ b/Pods/RxCocoa/RxCocoa/Traits/ControlProperty.swift @@ -6,9 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE import RxSwift -#endif /// Protocol that enables extension of `ControlProperty`. public protocol ControlPropertyType : ObservableType, ObserverType { @@ -40,7 +38,7 @@ public protocol ControlPropertyType : ObservableType, ObserverType { **If they aren't, then using this trait communicates wrong properties and could potentially break someone's code.** **In case `values` observable sequence that is being passed into initializer doesn't satisfy all enumerated - properties, please don't use this unit.** + properties, please don't use this trait.** */ public struct ControlProperty : ControlPropertyType { public typealias E = PropertyType @@ -102,7 +100,7 @@ public struct ControlProperty : ControlPropertyType { public func on(_ event: Event) { switch event { case .error(let error): - bindingErrorToInterface(error) + bindingError(error) case .next: _valueSink.on(event) case .completed: diff --git a/Pods/RxCocoa/RxCocoa/Traits/Driver/BehaviorRelay+Driver.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/BehaviorRelay+Driver.swift new file mode 100644 index 00000000..b882e40c --- /dev/null +++ b/Pods/RxCocoa/RxCocoa/Traits/Driver/BehaviorRelay+Driver.swift @@ -0,0 +1,20 @@ +// +// BehaviorRelay+Driver.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 10/7/17. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +import RxSwift + +extension BehaviorRelay { + /// Converts `BehaviorRelay` to `Driver`. + /// + /// - returns: Observable sequence. + public func asDriver() -> Driver { + let source = self.asObservable() + .observeOn(DriverSharingStrategy.scheduler) + return SharedSequence(source) + } +} diff --git a/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlEvent+Driver.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlEvent+Driver.swift index 7a9f0b09..c0ca704d 100644 --- a/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlEvent+Driver.swift +++ b/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlEvent+Driver.swift @@ -6,9 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE import RxSwift -#endif extension ControlEvent { /// Converts `ControlEvent` to `Driver` trait. diff --git a/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlProperty+Driver.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlProperty+Driver.swift index 214ed19c..c8097805 100644 --- a/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlProperty+Driver.swift +++ b/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlProperty+Driver.swift @@ -6,9 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE import RxSwift -#endif extension ControlProperty { /// Converts `ControlProperty` to `Driver` trait. diff --git a/Pods/RxCocoa/RxCocoa/Traits/Driver/Driver+Subscription.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/Driver+Subscription.swift index 9957ce3b..877a2a0a 100644 --- a/Pods/RxCocoa/RxCocoa/Traits/Driver/Driver+Subscription.swift +++ b/Pods/RxCocoa/RxCocoa/Traits/Driver/Driver+Subscription.swift @@ -6,14 +6,11 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE import RxSwift -#endif -private let driverErrorMessage = "`drive*` family of methods can be only called from `MainThread`.\n" + +private let errorMessage = "`drive*` family of methods can be only called from `MainThread`.\n" + "This is required to ensure that the last replayed `Driver` element is delivered on `MainThread`.\n" -// This would ideally be Driver, but unfortunately Driver can't be extended in Swift 3.0 extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy { /** Creates new subscription and sends elements to observer. @@ -25,7 +22,7 @@ extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingSt - returns: Disposable object that can be used to unsubscribe the observer from the subject. */ public func drive(_ observer: O) -> Disposable where O.E == E { - MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) + MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage) return self.asSharedSequence().asObservable().subscribe(observer) } @@ -39,21 +36,21 @@ extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingSt - returns: Disposable object that can be used to unsubscribe the observer from the subject. */ public func drive(_ observer: O) -> Disposable where O.E == E? { - MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) + MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage) return self.asSharedSequence().asObservable().map { $0 as E? }.subscribe(observer) } /** - Creates new subscription and sends elements to variable. + Creates new subscription and sends elements to `BehaviorRelay`. This method can be only called from `MainThread`. - parameter variable: Target variable for sequence elements. - returns: Disposable object that can be used to unsubscribe the observer from the variable. */ - public func drive(_ variable: Variable) -> Disposable { - MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) + public func drive(_ relay: BehaviorRelay) -> Disposable { + MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage) return drive(onNext: { e in - variable.value = e + relay.accept(e) }) } @@ -64,10 +61,10 @@ extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingSt - parameter variable: Target variable for sequence elements. - returns: Disposable object that can be used to unsubscribe the observer from the variable. */ - public func drive(_ variable: Variable) -> Disposable { - MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) + public func drive(_ relay: BehaviorRelay) -> Disposable { + MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage) return drive(onNext: { e in - variable.value = e + relay.accept(e) }) } @@ -79,7 +76,7 @@ extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingSt - returns: Object representing subscription. */ public func drive(_ transformation: (Observable) -> R) -> R { - MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) + MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage) return transformation(self.asObservable()) } @@ -98,7 +95,7 @@ extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingSt - returns: Object representing subscription. */ public func drive(_ with: (Observable) -> (R1) -> R2, curriedArgument: R1) -> R2 { - MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) + MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage) return with(self.asObservable())(curriedArgument) } @@ -116,7 +113,7 @@ extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingSt - returns: Subscription object used to unsubscribe from the observable sequence. */ public func drive(onNext: ((E) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) -> Disposable { - MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) + MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage) return self.asObservable().subscribe(onNext: onNext, onCompleted: onCompleted, onDisposed: onDisposed) } } diff --git a/Pods/RxCocoa/RxCocoa/Traits/Driver/Driver.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/Driver.swift index fa35c9d3..1f422776 100644 --- a/Pods/RxCocoa/RxCocoa/Traits/Driver/Driver.swift +++ b/Pods/RxCocoa/RxCocoa/Traits/Driver/Driver.swift @@ -6,22 +6,23 @@ // Copyright © 2016 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE - import RxSwift -#endif - +import RxSwift /** Trait that represents observable sequence with following properties: - it never fails - it delivers events on `MainScheduler.instance` - - `shareReplayLatestWhileConnected()` behavior + - `share(replay: 1, scope: .whileConnected)` sharing strategy + + Additional explanation: - all observers share sequence computation resources - it's stateful, upon subscription (calling subscribe) last element is immediately replayed if it was produced - computation of elements is reference counted with respect to the number of observers - if there are no subscribers, it will release sequence computation resources + In case trait that models event bus is required, please check `Signal`. + `Driver` can be considered a builder pattern for observable sequences that drive the application. If observable sequence has produced at least one element, after new subscription is made last produced element will be @@ -37,9 +38,9 @@ public typealias Driver = SharedSequence public struct DriverSharingStrategy: SharingStrategyProtocol { - public static var scheduler: SchedulerType { return driverObserveOnScheduler() } + public static var scheduler: SchedulerType { return SharingScheduler.make() } public static func share(_ source: Observable) -> Observable { - return source.shareReplayLatestWhileConnected() + return source.share(replay: 1, scope: .whileConnected) } } @@ -50,41 +51,3 @@ extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingSt } } -/** - This method can be used in unit tests to ensure that driver is using mock schedulers instead of - main schedulers. - - **This shouldn't be used in normal release builds.** -*/ -public func driveOnScheduler(_ scheduler: SchedulerType, action: () -> ()) { - let originalObserveOnScheduler = driverObserveOnScheduler - driverObserveOnScheduler = { return scheduler } - - action() - - // If you remove this line , compiler buggy optimizations will change behavior of this code - _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(scheduler) - // Scary, I know - - driverObserveOnScheduler = originalObserveOnScheduler -} - -#if os(Linux) - import Glibc -#else - import func Foundation.arc4random -#endif - -func _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(_ scheduler: SchedulerType) { - let a: Int32 = 1 -#if os(Linux) - let b = 314 + Int32(Glibc.random() & 1) -#else - let b = 314 + Int32(arc4random() & 1) -#endif - if a == b { - print(scheduler) - } -} - -fileprivate var driverObserveOnScheduler: () -> SchedulerType = { MainScheduler() } diff --git a/Pods/RxCocoa/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift index f5e84d80..ac621904 100644 --- a/Pods/RxCocoa/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift +++ b/Pods/RxCocoa/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift @@ -6,16 +6,14 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE import RxSwift -#endif extension ObservableConvertibleType { /** - Converts anything convertible to `Observable` to `Driver` unit. + Converts observable sequence to `Driver` trait. - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence. - - returns: Driving observable sequence. + - returns: Driver trait. */ public func asDriver(onErrorJustReturn: E) -> Driver { let source = self @@ -26,10 +24,10 @@ extension ObservableConvertibleType { } /** - Converts anything convertible to `Observable` to `Driver` unit. + Converts observable sequence to `Driver` trait. - parameter onErrorDriveWith: Driver that continues to drive the sequence in case of error. - - returns: Driving observable sequence. + - returns: Driver trait. */ public func asDriver(onErrorDriveWith: Driver) -> Driver { let source = self @@ -42,10 +40,10 @@ extension ObservableConvertibleType { } /** - Converts anything convertible to `Observable` to `Driver` unit. + Converts observable sequence to `Driver` trait. - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error. - - returns: Driving observable sequence. + - returns: Driver trait. */ public func asDriver(onErrorRecover: @escaping (_ error: Swift.Error) -> Driver) -> Driver { let source = self diff --git a/Pods/RxCocoa/RxCocoa/Traits/Driver/Variable+Driver.swift b/Pods/RxCocoa/RxCocoa/Traits/Driver/Variable+Driver.swift deleted file mode 100644 index 7f200636..00000000 --- a/Pods/RxCocoa/RxCocoa/Traits/Driver/Variable+Driver.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// Variable+Driver.swift -// RxCocoa -// -// Created by Krunoslav Zaher on 12/28/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -#if !RX_NO_MODULE - import RxSwift -#endif - -extension Variable { - /// Converts `Variable` to `Driver` unit. - /// - /// - returns: Driving observable sequence. - public func asDriver() -> Driver { - let source = self.asObservable() - .observeOn(DriverSharingStrategy.scheduler) - return Driver(source) - } -} diff --git a/Pods/RxCocoa/RxCocoa/Traits/PublishRelay.swift b/Pods/RxCocoa/RxCocoa/Traits/PublishRelay.swift new file mode 100644 index 00000000..36142cb3 --- /dev/null +++ b/Pods/RxCocoa/RxCocoa/Traits/PublishRelay.swift @@ -0,0 +1,38 @@ +// +// PublishRelay.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 3/28/15. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +import RxSwift + +/// PublishRelay is a wrapper for `PublishSubject`. +/// +/// Unlike `PublishSubject` it can't terminate with error or completed. +public final class PublishRelay: ObservableType { + public typealias E = Element + + private let _subject: PublishSubject + + // Accepts `event` and emits it to subscribers + public func accept(_ event: Element) { + _subject.onNext(event) + } + + /// Initializes variable with initial value. + public init() { + _subject = PublishSubject() + } + + /// Subscribes observer + public func subscribe(_ observer: O) -> Disposable where O.E == E { + return _subject.subscribe(observer) + } + + /// - returns: Canonical interface for push style sequence + public func asObservable() -> Observable { + return _subject.asObservable() + } +} diff --git a/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift index ce8f71b9..dac504b5 100644 --- a/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift +++ b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift @@ -2,36 +2,34 @@ // ObservableConvertibleType+SharedSequence.swift // RxCocoa // -// Created by Krunoslav Zaher on 9/19/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// Created by Krunoslav Zaher on 11/1/17. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE import RxSwift -#endif extension ObservableConvertibleType { /** - Converts anything convertible to `Observable` to `SharedSequence` unit. - - - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence. - - returns: Driving observable sequence. - */ - public func asSharedSequence(sharingStrategy: S.Type = S.self, onErrorJustReturn: E) -> SharedSequence { + Converts anything convertible to `Observable` to `SharedSequence` unit. + + - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence. + - returns: Driving observable sequence. + */ + public func asSharedSequence(sharingStrategy: S.Type = S.self, onErrorJustReturn: E) -> SharedSequence { let source = self .asObservable() .observeOn(S.scheduler) .catchErrorJustReturn(onErrorJustReturn) return SharedSequence(source) } - + /** - Converts anything convertible to `Observable` to `SharedSequence` unit. - - - parameter onErrorDriveWith: SharedSequence that provides elements of the sequence in case of error. - - returns: Driving observable sequence. - */ - public func asSharedSequence(sharingStrategy: S.Type = S.self, onErrorDriveWith: SharedSequence) -> SharedSequence { + Converts anything convertible to `Observable` to `SharedSequence` unit. + + - parameter onErrorDriveWith: SharedSequence that provides elements of the sequence in case of error. + - returns: Driving observable sequence. + */ + public func asSharedSequence(sharingStrategy: S.Type = S.self, onErrorDriveWith: SharedSequence) -> SharedSequence { let source = self .asObservable() .observeOn(S.scheduler) @@ -42,12 +40,12 @@ extension ObservableConvertibleType { } /** - Converts anything convertible to `Observable` to `SharedSequence` unit. - - - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error. - - returns: Driving observable sequence. - */ - public func asSharedSequence(sharingStrategy: S.Type = S.self, onErrorRecover: @escaping (_ error: Swift.Error) -> SharedSequence) -> SharedSequence { + Converts anything convertible to `Observable` to `SharedSequence` unit. + + - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error. + - returns: Driving observable sequence. + */ + public func asSharedSequence(sharingStrategy: S.Type = S.self, onErrorRecover: @escaping (_ error: Swift.Error) -> SharedSequence) -> SharedSequence { let source = self .asObservable() .observeOn(S.scheduler) diff --git a/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SchedulerType+SharedSequence.swift b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SchedulerType+SharedSequence.swift new file mode 100644 index 00000000..b55911c5 --- /dev/null +++ b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SchedulerType+SharedSequence.swift @@ -0,0 +1,61 @@ +// +// SchedulerType+SharedSequence.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 8/27/17. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +import RxSwift + +public enum SharingScheduler { + /// Default scheduler used in SharedSequence based traits. + public private(set) static var make: () -> SchedulerType = { MainScheduler() } + + /** + This method can be used in unit tests to ensure that built in shared sequences are using mock schedulers instead + of main schedulers. + + **This shouldn't be used in normal release builds.** + */ + static public func mock(scheduler: SchedulerType, action: () -> ()) { + return mock(makeScheduler: { scheduler }, action: action) + } + + /** + This method can be used in unit tests to ensure that built in shared sequences are using mock schedulers instead + of main schedulers. + + **This shouldn't be used in normal release builds.** + */ + static public func mock(makeScheduler: @escaping () -> SchedulerType, action: () -> ()) { + let originalMake = make + make = makeScheduler + + action() + + // If you remove this line , compiler buggy optimizations will change behavior of this code + _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(makeScheduler) + // Scary, I know + + make = originalMake + } +} + +#if os(Linux) + import Glibc +#else + import func Foundation.arc4random +#endif + +func _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(_ scheduler: () -> SchedulerType) { + let a: Int32 = 1 +#if os(Linux) + let b = 314 + Int32(Glibc.random() & 1) +#else + let b = 314 + Int32(arc4random() & 1) +#endif + if a == b { + print(scheduler()) + } +} diff --git a/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift index 4e66cdb6..980d9d3c 100644 --- a/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift +++ b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift @@ -7,9 +7,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE import RxSwift -#endif diff --git a/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift index 8b0b9f61..7f4bd28f 100644 --- a/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift +++ b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift @@ -6,9 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE import RxSwift -#endif // MARK: map extension SharedSequenceConvertibleType { @@ -44,7 +42,7 @@ extension SharedSequenceConvertibleType { } // MARK: switchLatest -extension SharedSequenceConvertibleType where E : SharedSequenceConvertibleType, E.SharingStrategy == SharingStrategy { +extension SharedSequenceConvertibleType where E : SharedSequenceConvertibleType { /** Transforms an observable sequence of observable sequences into an observable sequence @@ -55,12 +53,12 @@ extension SharedSequenceConvertibleType where E : SharedSequenceConvertibleType, - returns: The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received. */ - public func switchLatest() -> SharedSequence { + public func switchLatest() -> SharedSequence { let source: Observable = self .asObservable() .map { $0.asSharedSequence() } .switchLatest() - return SharedSequence(source) + return SharedSequence(source) } } @@ -76,12 +74,12 @@ extension SharedSequenceConvertibleType { - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received. */ - public func flatMapLatest(_ selector: @escaping (E) -> SharedSequence) - -> SharedSequence { + public func flatMapLatest(_ selector: @escaping (E) -> SharedSequence) + -> SharedSequence { let source: Observable = self .asObservable() .flatMapLatest(selector) - return SharedSequence(source) + return SharedSequence(source) } } @@ -95,12 +93,12 @@ extension SharedSequenceConvertibleType { - parameter selector: A transform function to apply to element that was observed while no observable is executing in parallel. - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence that was received while no other sequence was being calculated. */ - public func flatMapFirst(_ selector: @escaping (E) -> SharedSequence) - -> SharedSequence { + public func flatMapFirst(_ selector: @escaping (E) -> SharedSequence) + -> SharedSequence { let source: Observable = self .asObservable() .flatMapFirst(selector) - return SharedSequence(source) + return SharedSequence(source) } } @@ -112,13 +110,14 @@ extension SharedSequenceConvertibleType { - parameter onNext: Action to invoke for each element in the observable sequence. - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - parameter onSubscribe: Action to invoke before subscribing to source observable sequence. + - parameter onSubscribed: Action to invoke after subscribing to source observable sequence. - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed. - returns: The source sequence with the side-effecting behavior applied. */ - public func `do`(onNext: ((E) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onSubscribe: (() -> ())? = nil, onDispose: (() -> ())? = nil) + public func `do`(onNext: ((E) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onSubscribe: (() -> ())? = nil, onSubscribed: (() -> ())? = nil, onDispose: (() -> ())? = nil) -> SharedSequence { let source = self.asObservable() - .do(onNext: onNext, onCompleted: onCompleted, onSubscribe: onSubscribe, onDispose: onDispose) + .do(onNext: onNext, onCompleted: onCompleted, onSubscribe: onSubscribe, onSubscribed: onSubscribed, onDispose: onDispose) return SharedSequence(source) } @@ -207,7 +206,7 @@ extension SharedSequenceConvertibleType { - parameter selector: A transform function to apply to each element. - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence. */ - public func flatMap(_ selector: @escaping (E) -> SharedSequence) -> SharedSequence { + public func flatMap(_ selector: @escaping (E) -> SharedSequence) -> SharedSequence { let source = self.asObservable() .flatMap(selector) @@ -260,17 +259,17 @@ extension SharedSequenceConvertibleType { } // MARK: merge -extension SharedSequenceConvertibleType where E : SharedSequenceConvertibleType, E.SharingStrategy == SharingStrategy { +extension SharedSequenceConvertibleType where E : SharedSequenceConvertibleType { /** Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence. - returns: The observable sequence that merges the elements of the observable sequences. */ - public func merge() -> SharedSequence { + public func merge() -> SharedSequence { let source = self.asObservable() .map { $0.asSharedSequence() } .merge() - return SharedSequence(source) + return SharedSequence(source) } /** @@ -280,11 +279,11 @@ extension SharedSequenceConvertibleType where E : SharedSequenceConvertibleType, - returns: The observable sequence that merges the elements of the inner sequences. */ public func merge(maxConcurrent: Int) - -> SharedSequence { + -> SharedSequence { let source = self.asObservable() .map { $0.asSharedSequence() } .merge(maxConcurrent: maxConcurrent) - return SharedSequence(source) + return SharedSequence(source) } } @@ -434,7 +433,7 @@ extension SharedSequenceConvertibleType { - parameter resultSelector: Function to invoke for each element from the self combined with the latest element from the second source, if any. - returns: An observable sequence containing the result of combining each element of the self with the latest element from the second source, if any, using the specified result selector function. */ - public func withLatestFrom(_ second: SecondO, resultSelector: @escaping (E, SecondO.E) -> ResultType) -> SharedSequence where SecondO.SharingStrategy == SecondO.SharingStrategy { + public func withLatestFrom(_ second: SecondO, resultSelector: @escaping (E, SecondO.E) -> ResultType) -> SharedSequence where SecondO.SharingStrategy == SharingStrategy { let source = self.asObservable() .withLatestFrom(second.asSharedSequence(), resultSelector: resultSelector) @@ -442,7 +441,7 @@ extension SharedSequenceConvertibleType { } /** - Merges two observable sequences into one observable sequence by using latest element from the second sequence every time when `self` emitts an element. + Merges two observable sequences into one observable sequence by using latest element from the second sequence every time when `self` emits an element. - parameter second: Second observable source. - returns: An observable sequence containing the result of combining each element of the self with the latest element from the second source, if any, using the specified result selector function. diff --git a/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence.swift b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence.swift index 1233faa2..b41e7d1c 100644 --- a/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence.swift +++ b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence.swift @@ -6,9 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#if !RX_NO_MODULE - import RxSwift -#endif +import RxSwift /** Trait that represents observable sequence that shares computation resources with following properties: @@ -74,7 +72,7 @@ public protocol SharingStrategyProtocol { /** Computation resources sharing strategy for multiple sequence observers. - E.g. One can choose `shareReplayWhenConnected`, `shareReplay` or `share` + E.g. One can choose `share(replay:scope:)` as sequence event sharing strategies, but also do something more exotic, like implementing promises or lazy loading chains. */ @@ -196,7 +194,7 @@ extension SharedSequence { } } -extension SharedSequence where Element : SignedInteger { +extension SharedSequence where Element : RxAbstractInteger { /** Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages. @@ -213,7 +211,7 @@ extension SharedSequence where Element : SignedInteger { // MARK: timer -extension SharedSequence where Element: SignedInteger { +extension SharedSequence where Element: RxAbstractInteger { /** Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers. diff --git a/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/Variable+SharedSequence.swift b/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/Variable+SharedSequence.swift deleted file mode 100644 index 3bf580d7..00000000 --- a/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/Variable+SharedSequence.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// Variable+SharedSequence.swift -// RxCocoa -// -// Created by Krunoslav Zaher on 12/28/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -#if !RX_NO_MODULE - import RxSwift -#endif - -extension Variable { - /// Converts `Variable` to `SharedSequence` unit. - /// - /// - returns: Observable sequence. - public func asSharedSequence(strategy: SharingStrategy.Type = SharingStrategy.self) -> SharedSequence { - let source = self.asObservable() - .observeOn(SharingStrategy.scheduler) - return SharedSequence(source) - } -} diff --git a/Pods/RxCocoa/RxCocoa/Traits/Signal/ControlEvent+Signal.swift b/Pods/RxCocoa/RxCocoa/Traits/Signal/ControlEvent+Signal.swift new file mode 100644 index 00000000..157f8d68 --- /dev/null +++ b/Pods/RxCocoa/RxCocoa/Traits/Signal/ControlEvent+Signal.swift @@ -0,0 +1,25 @@ +// +// ControlEvent+Signal.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 11/1/17. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +import RxSwift + +extension ControlEvent { + /// Converts `ControlEvent` to `Signal` trait. + /// + /// `ControlEvent` already can't fail, so no special case needs to be handled. + public func asSignal() -> Signal { + return self.asSignal { (error) -> Signal in + #if DEBUG + rxFatalError("Somehow signal received error from a source that shouldn't fail.") + #else + return Signal.empty() + #endif + } + } +} + diff --git a/Pods/RxCocoa/RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift b/Pods/RxCocoa/RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift new file mode 100644 index 00000000..acc073ab --- /dev/null +++ b/Pods/RxCocoa/RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift @@ -0,0 +1,58 @@ +// +// ObservableConvertibleType+Signal.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 9/19/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +import RxSwift + +extension ObservableConvertibleType { + /** + Converts observable sequence to `Signal` trait. + + - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence. + - returns: Signal trait. + */ + public func asSignal(onErrorJustReturn: E) -> Signal { + let source = self + .asObservable() + .observeOn(SignalSharingStrategy.scheduler) + .catchErrorJustReturn(onErrorJustReturn) + return Signal(source) + } + + /** + Converts observable sequence to `Driver` trait. + + - parameter onErrorDriveWith: Driver that continues to drive the sequence in case of error. + - returns: Signal trait. + */ + public func asSignal(onErrorSignalWith: Signal) -> Signal { + let source = self + .asObservable() + .observeOn(SignalSharingStrategy.scheduler) + .catchError { _ in + onErrorSignalWith.asObservable() + } + return Signal(source) + } + + /** + Converts observable sequence to `Driver` trait. + + - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error. + - returns: Signal trait. + */ + public func asSignal(onErrorRecover: @escaping (_ error: Swift.Error) -> Signal) -> Signal { + let source = self + .asObservable() + .observeOn(SignalSharingStrategy.scheduler) + .catchError { error in + onErrorRecover(error).asObservable() + } + return Signal(source) + } +} + diff --git a/Pods/RxCocoa/RxCocoa/Traits/Signal/PublishRelay+Signal.swift b/Pods/RxCocoa/RxCocoa/Traits/Signal/PublishRelay+Signal.swift new file mode 100644 index 00000000..ab4b8d83 --- /dev/null +++ b/Pods/RxCocoa/RxCocoa/Traits/Signal/PublishRelay+Signal.swift @@ -0,0 +1,20 @@ +// +// PublishRelay+Signal.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 12/28/15. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +import RxSwift + +extension PublishRelay { + /// Converts `PublishRelay` to `Signal`. + /// + /// - returns: Observable sequence. + public func asSignal() -> Signal { + let source = self.asObservable() + .observeOn(SignalSharingStrategy.scheduler) + return SharedSequence(source) + } +} diff --git a/Pods/RxCocoa/RxCocoa/Traits/Signal/Signal+Subscription.swift b/Pods/RxCocoa/RxCocoa/Traits/Signal/Signal+Subscription.swift new file mode 100644 index 00000000..cce1a8f5 --- /dev/null +++ b/Pods/RxCocoa/RxCocoa/Traits/Signal/Signal+Subscription.swift @@ -0,0 +1,78 @@ +// +// Signal+Subscription.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 9/19/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +import RxSwift + +extension SharedSequenceConvertibleType where SharingStrategy == SignalSharingStrategy { + /** + Creates new subscription and sends elements to observer. + + In this form it's equivalent to `subscribe` method, but it communicates intent better. + + - parameter to: Observer that receives events. + - returns: Disposable object that can be used to unsubscribe the observer from the subject. + */ + public func emit(to observer: O) -> Disposable where O.E == E { + return self.asSharedSequence().asObservable().subscribe(observer) + } + + /** + Creates new subscription and sends elements to observer. + + In this form it's equivalent to `subscribe` method, but it communicates intent better. + + - parameter to: Observer that receives events. + - returns: Disposable object that can be used to unsubscribe the observer from the subject. + */ + public func emit(to observer: O) -> Disposable where O.E == E? { + return self.asSharedSequence().asObservable().map { $0 as E? }.subscribe(observer) + } + + /** + Creates new subscription and sends elements to variable. + + - parameter relay: Target relay for sequence elements. + - returns: Disposable object that can be used to unsubscribe the observer from the variable. + */ + public func emit(to relay: PublishRelay) -> Disposable { + return emit(onNext: { e in + relay.accept(e) + }) + } + + /** + Creates new subscription and sends elements to variable. + + - parameter to: Target relay for sequence elements. + - returns: Disposable object that can be used to unsubscribe the observer from the variable. + */ + public func emit(to relay: PublishRelay) -> Disposable { + return emit(onNext: { e in + relay.accept(e) + }) + } + + /** + Subscribes an element handler, a completion handler and disposed handler to an observable sequence. + + Error callback is not exposed because `Signal` can't error out. + + - parameter onNext: Action to invoke for each element in the observable sequence. + - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. + gracefully completed, errored, or if the generation is canceled by disposing subscription) + - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has + gracefully completed, errored, or if the generation is canceled by disposing subscription) + - returns: Subscription object used to unsubscribe from the observable sequence. + */ + public func emit(onNext: ((E) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) -> Disposable { + return self.asObservable().subscribe(onNext: onNext, onCompleted: onCompleted, onDisposed: onDisposed) + } +} + + + diff --git a/Pods/RxCocoa/RxCocoa/Traits/Signal/Signal.swift b/Pods/RxCocoa/RxCocoa/Traits/Signal/Signal.swift new file mode 100644 index 00000000..b7175603 --- /dev/null +++ b/Pods/RxCocoa/RxCocoa/Traits/Signal/Signal.swift @@ -0,0 +1,45 @@ +// +// Signal.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 9/26/16. +// Copyright © 2016 Krunoslav Zaher. All rights reserved. +// + +import RxSwift + +/** + Trait that represents observable sequence with following properties: + + - it never fails + - it delivers events on `MainScheduler.instance` + - `share(scope: .whileConnected)` sharing strategy + + Additional explanation: + - all observers share sequence computation resources + - there is no replaying of sequence elements on new observer subscription + - computation of elements is reference counted with respect to the number of observers + - if there are no subscribers, it will release sequence computation resources + + In case trait that models state propagation is required, please check `Driver`. + + `Signal` can be considered a builder pattern for observable sequences that model imperative events part of the application. + + To find out more about units and how to use them, please visit `Documentation/Traits.md`. + */ +public typealias Signal = SharedSequence + +public struct SignalSharingStrategy : SharingStrategyProtocol { + public static var scheduler: SchedulerType { return SharingScheduler.make() } + + public static func share(_ source: Observable) -> Observable { + return source.share(scope: .whileConnected) + } +} + +extension SharedSequenceConvertibleType where SharingStrategy == SignalSharingStrategy { + /// Adds `asPublisher` to `SharingSequence` with `PublishSharingStrategy`. + public func asSignal() -> Signal { + return asSharedSequence() + } +} diff --git a/Pods/RxCocoa/RxCocoa/Traits/UIBindingObserver.swift b/Pods/RxCocoa/RxCocoa/Traits/UIBindingObserver.swift deleted file mode 100644 index cc711177..00000000 --- a/Pods/RxCocoa/RxCocoa/Traits/UIBindingObserver.swift +++ /dev/null @@ -1,64 +0,0 @@ -// -// UIBindingObserver.swift -// RxCocoa -// -// Created by Krunoslav Zaher on 2/7/16. -// Copyright © 2016 Krunoslav Zaher. All rights reserved. -// - -import Dispatch -#if !RX_NO_MODULE - import RxSwift -#endif - -/** -Observer that enforces interface binding rules: - * can't bind errors (in debug builds binding of errors causes `fatalError` in release builds errors are being logged) - * ensures binding is performed on main thread - -`UIBindingObserver` doesn't retain target interface and in case owned interface element is released, element isn't bound. - - In case event binding is attempted from non main dispatch queue, event binding will be dispatched async to main dispatch - queue. -*/ -public final class UIBindingObserver : ObserverType where UIElementType: AnyObject { - public typealias E = Value - - weak var UIElement: UIElementType? - - let binding: (UIElementType, Value) -> Void - - /// Initializes `ViewBindingObserver` using - public init(UIElement: UIElementType, binding: @escaping (UIElementType, Value) -> Void) { - self.UIElement = UIElement - self.binding = binding - } - - /// Binds next element to owner view as described in `binding`. - public func on(_ event: Event) { - if !DispatchQueue.isMain { - DispatchQueue.main.async { - self.on(event) - } - return - } - - switch event { - case .next(let element): - if let view = self.UIElement { - binding(view, element) - } - case .error(let error): - bindingErrorToInterface(error) - case .completed: - break - } - } - - /// Erases type of observer. - /// - /// - returns: type erased observer. - public func asObserver() -> AnyObserver { - return AnyObserver(eventHandler: on) - } -} diff --git a/Pods/RxCocoa/RxCocoa/macOS/NSButton+Rx.swift b/Pods/RxCocoa/RxCocoa/macOS/NSButton+Rx.swift index f86a0309..23c81ac8 100644 --- a/Pods/RxCocoa/RxCocoa/macOS/NSButton+Rx.swift +++ b/Pods/RxCocoa/RxCocoa/macOS/NSButton+Rx.swift @@ -8,9 +8,7 @@ #if os(macOS) -#if !RX_NO_MODULE import RxSwift -#endif import Cocoa extension Reactive where Base: NSButton { @@ -20,17 +18,29 @@ extension Reactive where Base: NSButton { return controlEvent } - /// Reactive wrapper for `state` property`. - public var state: ControlProperty { - return NSButton.rx.value( - base, - getter: { control in - return control.state - }, setter: { control, state in - control.state = state - } - ) - } + #if swift(>=4.0) + /// Reactive wrapper for `state` property`. + public var state: ControlProperty { + return base.rx.controlProperty( + getter: { control in + return control.state + }, setter: { (control: NSButton, state: NSControl.StateValue) in + control.state = state + } + ) + } + #else + /// Reactive wrapper for `state` property`. + public var state: ControlProperty { + return base.rx.controlProperty( + getter: { control in + return control.state + }, setter: { (control: NSButton, state: Int) in + control.state = state + } + ) + } + #endif } #endif diff --git a/Pods/RxCocoa/RxCocoa/macOS/NSControl+Rx.swift b/Pods/RxCocoa/RxCocoa/macOS/NSControl+Rx.swift index 32ecaa5f..47c1cf6c 100644 --- a/Pods/RxCocoa/RxCocoa/macOS/NSControl+Rx.swift +++ b/Pods/RxCocoa/RxCocoa/macOS/NSControl+Rx.swift @@ -9,9 +9,7 @@ #if os(macOS) import Cocoa -#if !RX_NO_MODULE import RxSwift -#endif fileprivate var rx_value_key: UInt8 = 0 fileprivate var rx_control_events_key: UInt8 = 0 @@ -19,7 +17,7 @@ fileprivate var rx_control_events_key: UInt8 = 0 extension Reactive where Base: NSControl { /// Reactive wrapper for control event. - public var controlEvent: ControlEvent { + public var controlEvent: ControlEvent<()> { MainScheduler.ensureExecutingOnScheduler() let source = lazyInstanceObservable(&rx_control_events_key) { () -> Observable in @@ -32,52 +30,65 @@ extension Reactive where Base: NSControl { } let observer = ControlTarget(control: control) { control in - observer.on(.next()) + observer.on(.next(())) } return observer - }.takeUntil(self.deallocated) + } + .takeUntil(self.deallocated) + .share() } - + return ControlEvent(events: source) } - /// You might be wondering why the ugly `as!` casts etc, well, for some reason if - /// Swift compiler knows C is UIControl type and optimizations are turned on, it will crash. - static func value(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty { + /// Creates a `ControlProperty` that is triggered by target/action pattern value updates. + /// + /// - parameter getter: Property value getter. + /// - parameter setter: Property value setter. + public func controlProperty( + getter: @escaping (Base) -> T, + setter: @escaping (Base, T) -> () + ) -> ControlProperty { MainScheduler.ensureExecutingOnScheduler() - let source = (control as! NSObject).rx.lazyInstanceObservable(&rx_value_key) { () -> Observable in - return Observable.create { [weak weakControl = control] (observer: AnyObserver) in - guard let control = weakControl else { - observer.on(.completed) - return Disposables.create() - } + let source = base.rx.lazyInstanceObservable(&rx_value_key) { () -> Observable<()> in + return Observable.create { [weak weakControl = self.base] (observer: AnyObserver<()>) in + guard let control = weakControl else { + observer.on(.completed) + return Disposables.create() + } - observer.on(.next(getter(control))) + observer.on(.next(())) - let observer = ControlTarget(control: control as! NSControl) { _ in - if let control = weakControl { - observer.on(.next(getter(control))) + let observer = ControlTarget(control: control) { _ in + if weakControl != nil { + observer.on(.next(())) + } } + + return observer } - - return observer + .takeUntil(deallocated) + .share(replay: 1, scope: .whileConnected) + } + .flatMap { [weak base] _ -> Observable in + guard let control = base else { return Observable.empty() } + return Observable.just(getter(control)) } - .takeUntil((control as! NSObject).rx.deallocated) - } - let bindingObserver = UIBindingObserver(UIElement: control, binding: setter) + let bindingObserver = Binder(base, binding: setter) return ControlProperty(values: source, valueSink: bindingObserver) } /// Bindable sink for `enabled` property. - public var isEnabled: UIBindingObserver { - return UIBindingObserver(UIElement: self.base) { (owner, value) in + public var isEnabled: Binder { + return Binder(self.base) { (owner, value) in owner.isEnabled = value } } } + #endif diff --git a/Pods/RxCocoa/RxCocoa/macOS/NSImageView+Rx.swift b/Pods/RxCocoa/RxCocoa/macOS/NSImageView+Rx.swift index c0787d9d..bc83b67d 100644 --- a/Pods/RxCocoa/RxCocoa/macOS/NSImageView+Rx.swift +++ b/Pods/RxCocoa/RxCocoa/macOS/NSImageView+Rx.swift @@ -8,36 +8,15 @@ #if os(macOS) -#if !RX_NO_MODULE import RxSwift -#endif import Cocoa extension Reactive where Base: NSImageView { /// Bindable sink for `image` property. - public var image: UIBindingObserver { - return image(transitionType: nil) - } - - /// Bindable sink for `image` property. - /// - /// - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...) - public func image(transitionType: String? = nil) -> UIBindingObserver { - return UIBindingObserver(UIElement: self.base) { control, value in - if let transitionType = transitionType { - if value != nil { - let transition = CATransition() - transition.duration = 0.25 - transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) - transition.type = transitionType - control.layer?.add(transition, forKey: kCATransition) - } - } - else { - control.layer?.removeAllAnimations() - } - control.image = value + public var image: Binder { + return Binder(base) { imageView, image in + imageView.image = image } } } diff --git a/Pods/RxCocoa/RxCocoa/macOS/NSSlider+Rx.swift b/Pods/RxCocoa/RxCocoa/macOS/NSSlider+Rx.swift index cc7a050e..ee28eb77 100644 --- a/Pods/RxCocoa/RxCocoa/macOS/NSSlider+Rx.swift +++ b/Pods/RxCocoa/RxCocoa/macOS/NSSlider+Rx.swift @@ -8,17 +8,14 @@ #if os(macOS) -#if !RX_NO_MODULE import RxSwift -#endif import Cocoa extension Reactive where Base: NSSlider { /// Reactive wrapper for `value` property. public var value: ControlProperty { - return NSControl.rx.value( - base, + return base.rx.controlProperty( getter: { control in return control.doubleValue }, diff --git a/Pods/RxCocoa/RxCocoa/macOS/NSTextField+Rx.swift b/Pods/RxCocoa/RxCocoa/macOS/NSTextField+Rx.swift index df46a50c..671ca406 100644 --- a/Pods/RxCocoa/RxCocoa/macOS/NSTextField+Rx.swift +++ b/Pods/RxCocoa/RxCocoa/macOS/NSTextField+Rx.swift @@ -9,90 +9,74 @@ #if os(macOS) import Cocoa -#if !RX_NO_MODULE import RxSwift -#endif /// Delegate proxy for `NSTextField`. /// /// For more information take a look at `DelegateProxyType`. -public class RxTextFieldDelegateProxy - : DelegateProxy - , NSTextFieldDelegate - , DelegateProxyType { - - fileprivate let textSubject = PublishSubject() +open class RxTextFieldDelegateProxy + : DelegateProxy + , DelegateProxyType + , NSTextFieldDelegate { /// Typed parent object. public weak private(set) var textField: NSTextField? /// Initializes `RxTextFieldDelegateProxy` /// - /// - parameter parentObject: Parent object for delegate proxy. - public required init(parentObject: AnyObject) { - self.textField = castOrFatalError(parentObject) - super.init(parentObject: parentObject) + /// - parameter textField: Parent object for delegate proxy. + init(textField: NSTextField) { + self.textField = textField + super.init(parentObject: textField, delegateProxy: RxTextFieldDelegateProxy.self) + } + + public static func registerKnownImplementations() { + self.register { RxTextFieldDelegateProxy(textField: $0) } } + fileprivate let textSubject = PublishSubject() + // MARK: Delegate methods - public override func controlTextDidChange(_ notification: Notification) { + open override func controlTextDidChange(_ notification: Notification) { let textField: NSTextField = castOrFatalError(notification.object) let nextValue = textField.stringValue self.textSubject.on(.next(nextValue)) - _forwardToDelegate?.controlTextDidChange(notification) + _forwardToDelegate?.controlTextDidChange?(notification) } // MARK: Delegate proxy methods /// For more information take a look at `DelegateProxyType`. - public override class func createProxyForObject(_ object: AnyObject) -> AnyObject { - let control: NSTextField = castOrFatalError(object) - return control.createRxDelegateProxy() + open class func currentDelegate(for object: ParentObject) -> NSTextFieldDelegate? { + return object.delegate } /// For more information take a look at `DelegateProxyType`. - public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { - let textField: NSTextField = castOrFatalError(object) - return textField.delegate - } - - /// For more information take a look at `DelegateProxyType`. - public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { - let textField: NSTextField = castOrFatalError(object) - textField.delegate = castOptionalOrFatalError(delegate) + open class func setCurrentDelegate(_ delegate: NSTextFieldDelegate?, to object: ParentObject) { + object.delegate = delegate } } -extension NSTextField { - - /// Factory method that enables subclasses to implement their own `delegate`. - /// - /// - returns: Instance of delegate proxy that wraps `delegate`. - public func createRxDelegateProxy() -> RxTextFieldDelegateProxy { - return RxTextFieldDelegateProxy(parentObject: self) - } -} - extension Reactive where Base: NSTextField { /// Reactive wrapper for `delegate`. /// /// For more information take a look at `DelegateProxyType` protocol documentation. - public var delegate: DelegateProxy { - return RxTextFieldDelegateProxy.proxyForObject(base) + public var delegate: DelegateProxy { + return RxTextFieldDelegateProxy.proxy(for: base) } /// Reactive wrapper for `text` property. public var text: ControlProperty { - let delegate = RxTextFieldDelegateProxy.proxyForObject(base) + let delegate = RxTextFieldDelegateProxy.proxy(for: base) let source = Observable.deferred { [weak textField = self.base] in delegate.textSubject.startWith(textField?.stringValue) }.takeUntil(deallocated) - let observer = UIBindingObserver(UIElement: base) { (control, value: String?) in + let observer = Binder(base) { (control, value: String?) in control.stringValue = value ?? "" } diff --git a/Pods/RxCocoa/RxCocoa/macOS/NSView+Rx.swift b/Pods/RxCocoa/RxCocoa/macOS/NSView+Rx.swift index f2dbeb7a..060829d7 100644 --- a/Pods/RxCocoa/RxCocoa/macOS/NSView+Rx.swift +++ b/Pods/RxCocoa/RxCocoa/macOS/NSView+Rx.swift @@ -9,21 +9,19 @@ #if os(macOS) import Cocoa - #if !RX_NO_MODULE import RxSwift - #endif extension Reactive where Base: NSView { /// Bindable sink for `hidden` property. - public var isHidden: UIBindingObserver { - return UIBindingObserver(UIElement: self.base) { view, value in + public var isHidden: Binder { + return Binder(self.base) { view, value in view.isHidden = value } } /// Bindable sink for `alphaValue` property. - public var alpha: UIBindingObserver { - return UIBindingObserver(UIElement: self.base) { view, value in + public var alpha: Binder { + return Binder(self.base) { view, value in view.alphaValue = value } } diff --git a/Pods/RxSwift/Platform/DataStructures/Bag.swift b/Pods/RxSwift/Platform/DataStructures/Bag.swift index 897cdadf..002c3a6c 100644 --- a/Pods/RxSwift/Platform/DataStructures/Bag.swift +++ b/Pods/RxSwift/Platform/DataStructures/Bag.swift @@ -80,15 +80,11 @@ struct Bag : CustomDebugStringConvertible { } if _pairs.count < arrayDictionaryMaxSize { - _pairs.append(key: key, value: element) + _pairs.append((key: key, value: element)) return key } - - if _dictionary == nil { - _dictionary = [:] - } - - _dictionary![key] = element + + _dictionary = [key: element] return key } diff --git a/Pods/RxSwift/Platform/DataStructures/PriorityQueue.swift b/Pods/RxSwift/Platform/DataStructures/PriorityQueue.swift index fae70a05..9b2c370e 100644 --- a/Pods/RxSwift/Platform/DataStructures/PriorityQueue.swift +++ b/Pods/RxSwift/Platform/DataStructures/PriorityQueue.swift @@ -52,7 +52,11 @@ struct PriorityQueue { private mutating func removeAt(_ index: Int) { let removingLast = index == _elements.count - 1 if !removingLast { + #if swift(>=3.2) + _elements.swapAt(index, _elements.count - 1) + #else swap(&_elements[index], &_elements[_elements.count - 1]) + #endif } _ = _elements.popLast() @@ -72,8 +76,11 @@ struct PriorityQueue { while unbalancedIndex > 0 { let parentIndex = (unbalancedIndex - 1) / 2 guard _hasHigherPriority(_elements[unbalancedIndex], _elements[parentIndex]) else { break } - + #if swift(>=3.2) + _elements.swapAt(unbalancedIndex, parentIndex) + #else swap(&_elements[unbalancedIndex], &_elements[parentIndex]) + #endif unbalancedIndex = parentIndex } } @@ -99,7 +106,11 @@ struct PriorityQueue { guard highestPriorityIndex != unbalancedIndex else { break } + #if swift(>=3.2) + _elements.swapAt(highestPriorityIndex, unbalancedIndex) + #else swap(&_elements[highestPriorityIndex], &_elements[unbalancedIndex]) + #endif unbalancedIndex = highestPriorityIndex } } diff --git a/Pods/RxSwift/Platform/DeprecationWarner.swift b/Pods/RxSwift/Platform/DeprecationWarner.swift new file mode 100644 index 00000000..863636b7 --- /dev/null +++ b/Pods/RxSwift/Platform/DeprecationWarner.swift @@ -0,0 +1,43 @@ +// +// DeprecationWarner.swift +// Platform +// +// Created by Shai Mishali on 1/9/18. +// Copyright © 2018 Krunoslav Zaher. All rights reserved. +// + +import Foundation + +#if DEBUG + class DeprecationWarner { + private static var warned = Set() + private static var _lock = NSRecursiveLock() + + static func warnIfNeeded(_ kind: Kind) { + _lock.lock(); defer { _lock.unlock() } + guard !warned.contains(kind) else { return } + + warned.insert(kind) + print("ℹ️ [DEPRECATED] \(kind.message)") + } + } + + extension DeprecationWarner { + enum Kind { + case variable + case globalTestFunctionNext + case globalTestFunctionError + case globalTestFunctionCompleted + + var message: String { + switch self { + case .variable: return "`Variable` is planned for future deprecation. Please consider `BehaviorRelay` as a replacement. Read more at: https://git.io/vNqvx" + case .globalTestFunctionNext: return "The `next()` global function is planned for future deprecation. Please use `Recorded.next()` instead." + case .globalTestFunctionError: return "The `error()` global function is planned for future deprecation. Please use `Recorded.error()` instead." + case .globalTestFunctionCompleted: return "The `completed()` global function is planned for future deprecation. Please use `Recorded.completed()` instead." + } + } + } + } +#endif + diff --git a/Pods/RxSwift/README.md b/Pods/RxSwift/README.md index bdf8a2ba..a423675a 100644 --- a/Pods/RxSwift/README.md +++ b/Pods/RxSwift/README.md @@ -3,6 +3,8 @@ [![Travis CI](https://travis-ci.org/ReactiveX/RxSwift.svg?branch=master)](https://travis-ci.org/ReactiveX/RxSwift) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-333333.svg) ![pod](https://img.shields.io/cocoapods/v/RxSwift.svg) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) +* RxSwift 3.x / Swift 3.x can be found in [**rxswift-3.0** branch](https://github.com/ReactiveX/RxSwift/tree/rxswift-3.0). + Rx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable` interface. This is a Swift version of [Rx](https://github.com/Reactive-Extensions/Rx.NET). @@ -39,10 +41,10 @@ KVO observing, async operations and streams are all unified under [abstraction o ###### ... interact -* All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences.
[![Slack channel](http://rxswift-slack.herokuapp.com/badge.svg)](http://rxswift-slack.herokuapp.com/) [Join Slack Channel](http://rxswift-slack.herokuapp.com) +* All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences.
[![Slack channel](http://rxswift-slack.herokuapp.com/badge.svg)](http://bit.ly/rxslack) [Join Slack Channel](http://bit.ly/rxslack) * Report a problem using the library. [Open an Issue With Bug Template](.github/ISSUE_TEMPLATE.md) * Request a new feature. [Open an Issue With Feature Request Template](Documentation/NewFeatureRequestTemplate.md) - +* Help out [Check out contribution guide](CONTRIBUTING.md) ###### ... compare @@ -102,8 +104,9 @@ searchResults ## Requirements -* Xcode 8.0 -* Swift 3.0 +* Xcode 9.0 +* Swift 4.0 +* Swift 3.x ([use `rxswift-3.0` branch](https://github.com/ReactiveX/RxSwift/tree/rxswift-3.0) instead) * Swift 2.3 ([use `rxswift-2.0` branch](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) instead) ## Installation @@ -118,21 +121,21 @@ Open Rx.xcworkspace, choose `RxExample` and hit run. This method will build ever ### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html) -**Tested with `pod --version`: `1.1.1`** +**Tested with `pod --version`: `1.3.1`** ```ruby # Podfile use_frameworks! target 'YOUR_TARGET_NAME' do - pod 'RxSwift', '~> 3.0' - pod 'RxCocoa', '~> 3.0' + pod 'RxSwift', '~> 4.0' + pod 'RxCocoa', '~> 4.0' end # RxTests and RxBlocking make the most sense in the context of unit/integration tests target 'YOUR_TESTING_TARGET' do - pod 'RxBlocking', '~> 3.0' - pod 'RxTest', '~> 3.0' + pod 'RxBlocking', '~> 4.0' + pod 'RxTest', '~> 4.0' end ``` @@ -144,12 +147,12 @@ $ pod install ### [Carthage](https://github.com/Carthage/Carthage) -**Tested with `carthage version`: `0.18.1`** +**Tested with `carthage version`: `0.26.2`** Add this to `Cartfile` ``` -github "ReactiveX/RxSwift" ~> 3.0 +github "ReactiveX/RxSwift" ~> 4.0 ``` ```bash @@ -158,19 +161,23 @@ $ carthage update ### [Swift Package Manager](https://github.com/apple/swift-package-manager) -**Tested with `swift build --version`: `3.0.0 (swiftpm-19)`** +**Tested with `swift build --version`: `Swift 4.0.0-dev (swiftpm-13126)`** Create a `Package.swift` file. ```swift +// swift-tools-version:4.0 + import PackageDescription let package = Package( - name: "RxTestProject", - targets: [], - dependencies: [ - .Package(url: "https://github.com/ReactiveX/RxSwift.git", majorVersion: 3) - ] + name: "RxTestProject", + dependencies: [ + .package(url: "https://github.com/ReactiveX/RxSwift.git", "4.0.0" ..< "5.0.0") + ], + targets: [ + .target(name: "RxTestProject", dependencies: ["RxSwift", "RxCocoa"]) + ] ) ``` diff --git a/Pods/RxSwift/RxSwift/Concurrency/SynchronizedSubscribeType.swift b/Pods/RxSwift/RxSwift/Concurrency/SynchronizedSubscribeType.swift deleted file mode 100644 index e6f1d73e..00000000 --- a/Pods/RxSwift/RxSwift/Concurrency/SynchronizedSubscribeType.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// SynchronizedSubscribeType.swift -// RxSwift -// -// Created by Krunoslav Zaher on 10/25/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -protocol SynchronizedSubscribeType : class, ObservableType, Lock { - func _synchronized_subscribe(_ observer: O) -> Disposable where O.E == E -} - -extension SynchronizedSubscribeType { - func synchronizedSubscribe(_ observer: O) -> Disposable where O.E == E { - lock(); defer { unlock() } - return _synchronized_subscribe(observer) - } -} diff --git a/Pods/RxSwift/RxSwift/Deprecated.swift b/Pods/RxSwift/RxSwift/Deprecated.swift index 8ebfb0a6..cc673c70 100644 --- a/Pods/RxSwift/RxSwift/Deprecated.swift +++ b/Pods/RxSwift/RxSwift/Deprecated.swift @@ -35,15 +35,194 @@ extension Observable { } } +extension ObservableType { + /** + + Projects each element of an observable sequence into a new form by incorporating the element's index. + + - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html) + + - parameter selector: A transform function to apply to each source element; the second parameter of the function represents the index of the source element. + - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source. + */ + @available(*, deprecated, message: "Please use enumerated().map()") + public func mapWithIndex(_ selector: @escaping (E, Int) throws -> R) + -> Observable { + return enumerated().map { try selector($0.element, $0.index) } + } + + + /** + + Projects each element of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence. + + - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html) + + - parameter selector: A transform function to apply to each element; the second parameter of the function represents the index of the source element. + - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence. + */ + @available(*, deprecated, message: "Please use enumerated().flatMap()") + public func flatMapWithIndex(_ selector: @escaping (E, Int) throws -> O) + -> Observable { + return enumerated().flatMap { try selector($0.element, $0.index) } + } + + /** + + Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements. + The element's index is used in the logic of the predicate function. + + - seealso: [skipWhile operator on reactivex.io](http://reactivex.io/documentation/operators/skipwhile.html) + + - parameter predicate: A function to test each element for a condition; the second parameter of the function represents the index of the source element. + - returns: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate. + */ + @available(*, deprecated, message: "Please use enumerated().skipWhile().map()") + public func skipWhileWithIndex(_ predicate: @escaping (E, Int) throws -> Bool) -> Observable { + return enumerated().skipWhile { try predicate($0.element, $0.index) }.map { $0.element } + } + + + /** + + Returns elements from an observable sequence as long as a specified condition is true. + + The element's index is used in the logic of the predicate function. + + - seealso: [takeWhile operator on reactivex.io](http://reactivex.io/documentation/operators/takewhile.html) + + - parameter predicate: A function to test each element for a condition; the second parameter of the function represents the index of the source element. + - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes. + */ + @available(*, deprecated, message: "Please use enumerated().takeWhile().map()") + public func takeWhileWithIndex(_ predicate: @escaping (E, Int) throws -> Bool) -> Observable { + return enumerated().takeWhile { try predicate($0.element, $0.index) }.map { $0.element } + } +} + extension Disposable { /// Deprecated in favor of `disposed(by:)` /// - /// **@available(\*, deprecated, message="use disposed(by:) instead")** /// /// Adds `self` to `bag`. /// /// - parameter bag: `DisposeBag` to add `self` to. + @available(*, deprecated, message: "use disposed(by:) instead", renamed: "disposed(by:)") public func addDisposableTo(_ bag: DisposeBag) { disposed(by: bag) } } + + +extension ObservableType { + + /** + Returns an observable sequence that shares a single subscription to the underlying sequence, and immediately upon subscription replays latest element in buffer. + + This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed. + + - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html) + + - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence. + */ + @available(*, deprecated, message: "use share(replay: 1) instead", renamed: "share(replay:)") + public func shareReplayLatestWhileConnected() + -> Observable { + return share(replay: 1, scope: .whileConnected) + } +} + + +extension ObservableType { + + /** + Returns an observable sequence that shares a single subscription to the underlying sequence, and immediately upon subscription replays maximum number of elements in buffer. + + This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed. + + - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html) + + - parameter bufferSize: Maximum element count of the replay buffer. + - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence. + */ + @available(*, deprecated, message: "Suggested replacement is `share(replay: 1)`. In case old 3.x behavior of `shareReplay` is required please use `share(replay: 1, scope: .forever)` instead.", renamed: "share(replay:)") + public func shareReplay(_ bufferSize: Int) + -> Observable { + return self.share(replay: bufferSize, scope: .forever) + } +} + +/// Variable is a wrapper for `BehaviorSubject`. +/// +/// Unlike `BehaviorSubject` it can't terminate with error, and when variable is deallocated +/// it will complete its observable sequence (`asObservable`). +/// +/// **This concept will be deprecated from RxSwift but offical migration path hasn't been decided yet.** +/// https://github.com/ReactiveX/RxSwift/issues/1501 +/// +/// Current recommended replacement for this API is `RxCocoa.BehaviorRelay` because: +/// * `Variable` isn't a standard cross platform concept, hence it's out of place in RxSwift target. +/// * It doesn't have a counterpart for handling events (`PublishRelay`). It models state only. +/// * It doesn't have a consistent naming with *Relay or other Rx concepts. +/// * It has an inconsistent memory management model compared to other parts of RxSwift (completes on `deinit`). +/// +/// Once plans are finalized, official availability attribute will be added in one of upcoming versions. +public final class Variable { + + public typealias E = Element + + private let _subject: BehaviorSubject + + private var _lock = SpinLock() + + // state + private var _value: E + + #if DEBUG + fileprivate let _synchronizationTracker = SynchronizationTracker() + #endif + + /// Gets or sets current value of variable. + /// + /// Whenever a new value is set, all the observers are notified of the change. + /// + /// Even if the newly set value is same as the old value, observers are still notified for change. + public var value: E { + get { + _lock.lock(); defer { _lock.unlock() } + return _value + } + set(newValue) { + #if DEBUG + _synchronizationTracker.register(synchronizationErrorMessage: .variable) + defer { _synchronizationTracker.unregister() } + #endif + _lock.lock() + _value = newValue + _lock.unlock() + + _subject.on(.next(newValue)) + } + } + + /// Initializes variable with initial value. + /// + /// - parameter value: Initial variable value. + public init(_ value: Element) { + #if DEBUG + DeprecationWarner.warnIfNeeded(.variable) + #endif + + _value = value + _subject = BehaviorSubject(value: value) + } + + /// - returns: Canonical interface for push style sequence + public func asObservable() -> Observable { + return _subject + } + + deinit { + _subject.on(.completed) + } +} diff --git a/Pods/RxSwift/RxSwift/Disposables/SerialDisposable.swift b/Pods/RxSwift/RxSwift/Disposables/SerialDisposable.swift index 4f34bdbe..6373d2bb 100644 --- a/Pods/RxSwift/RxSwift/Disposables/SerialDisposable.swift +++ b/Pods/RxSwift/RxSwift/Disposables/SerialDisposable.swift @@ -34,7 +34,7 @@ public final class SerialDisposable : DisposeBase, Cancelable { public var disposable: Disposable { get { return _lock.calculateLocked { - return self.disposable + return _current ?? Disposables.create() } } set (newDisposable) { diff --git a/Pods/RxSwift/RxSwift/ObservableType+Extensions.swift b/Pods/RxSwift/RxSwift/ObservableType+Extensions.swift index ad6fed65..d558cca0 100644 --- a/Pods/RxSwift/RxSwift/ObservableType+Extensions.swift +++ b/Pods/RxSwift/RxSwift/ObservableType+Extensions.swift @@ -6,121 +6,136 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // +#if DEBUG + import Foundation +#endif + extension ObservableType { /** - Subscribes an event handler to an observable sequence. - - - parameter on: Action to invoke for each event in the observable sequence. - - returns: Subscription object used to unsubscribe from the observable sequence. - */ + Subscribes an event handler to an observable sequence. + + - parameter on: Action to invoke for each event in the observable sequence. + - returns: Subscription object used to unsubscribe from the observable sequence. + */ public func subscribe(_ on: @escaping (Event) -> Void) -> Disposable { - let observer = AnonymousObserver { e in - on(e) - } - return self.subscribeSafe(observer) - } - - #if DEBUG - /** - Subscribes an element handler, an error handler, a completion handler and disposed handler to an observable sequence. - - - parameter onNext: Action to invoke for each element in the observable sequence. - - parameter onError: Action to invoke upon errored termination of the observable sequence. - - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has - gracefully completed, errored, or if the generation is canceled by disposing subscription). - - returns: Subscription object used to unsubscribe from the observable sequence. - */ - public func subscribe(file: String = #file, line: UInt = #line, function: String = #function, onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) - -> Disposable { - - let disposable: Disposable - - if let disposed = onDisposed { - disposable = Disposables.create(with: disposed) - } - else { - disposable = Disposables.create() + let observer = AnonymousObserver { e in + on(e) } - + return self.asObservable().subscribe(observer) + } + + + /** + Subscribes an element handler, an error handler, a completion handler and disposed handler to an observable sequence. + + - parameter onNext: Action to invoke for each element in the observable sequence. + - parameter onError: Action to invoke upon errored termination of the observable sequence. + - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. + - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has + gracefully completed, errored, or if the generation is canceled by disposing subscription). + - returns: Subscription object used to unsubscribe from the observable sequence. + */ + public func subscribe(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) + -> Disposable { #if DEBUG - let _synchronizationTracker = SynchronizationTracker() - #endif + let disposable: Disposable + + if let disposed = onDisposed { + disposable = Disposables.create(with: disposed) + } + else { + disposable = Disposables.create() + } + + let synchronizationTracker = SynchronizationTracker() - let observer = AnonymousObserver { e in - #if DEBUG - _synchronizationTracker.register(synchronizationErrorMessage: .default) - defer { _synchronizationTracker.unregister() } - #endif + let callStack = Hooks.recordCallStackOnError ? Thread.callStackSymbols : [] - switch e { - case .next(let value): - onNext?(value) - case .error(let e): - if let onError = onError { - onError(e) + let observer = AnonymousObserver { event in + + synchronizationTracker.register(synchronizationErrorMessage: .default) + defer { synchronizationTracker.unregister() } + + switch event { + case .next(let value): + onNext?(value) + case .error(let error): + if let onError = onError { + onError(error) + } + else { + Hooks.defaultErrorHandler(callStack, error) + } + disposable.dispose() + case .completed: + onCompleted?() + disposable.dispose() } - else { - print("Received unhandled error: \(file):\(line):\(function) -> \(e)") + } + return Disposables.create( + self.asObservable().subscribe(observer), + disposable + ) + #else + let disposable: Disposable + + if let disposed = onDisposed { + disposable = Disposables.create(with: disposed) + } + else { + disposable = Disposables.create() + } + + let observer = AnonymousObserver { event in + switch event { + case .next(let value): + onNext?(value) + case .error(let error): + if let onError = onError { + onError(error) + } + else { + Hooks.defaultErrorHandler([], error) + } + disposable.dispose() + case .completed: + onCompleted?() + disposable.dispose() } - disposable.dispose() - case .completed: - onCompleted?() - disposable.dispose() } - } - return Disposables.create( - self.subscribeSafe(observer), - disposable - ) - } - #else - /** - Subscribes an element handler, an error handler, a completion handler and disposed handler to an observable sequence. + return Disposables.create( + self.asObservable().subscribe(observer), + disposable + ) + #endif + + } +} - - parameter onNext: Action to invoke for each element in the observable sequence. - - parameter onError: Action to invoke upon errored termination of the observable sequence. - - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has - gracefully completed, errored, or if the generation is canceled by disposing subscription). - - returns: Subscription object used to unsubscribe from the observable sequence. - */ - public func subscribe(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) - -> Disposable { +import class Foundation.NSRecursiveLock - let disposable: Disposable +extension Hooks { + public typealias DefaultErrorHandler = (_ subscriptionCallStack: [String], _ error: Error) -> () - if let disposed = onDisposed { - disposable = Disposables.create(with: disposed) - } - else { - disposable = Disposables.create() - } + fileprivate static let _lock = RecursiveLock() + fileprivate static var _defaultErrorHandler: DefaultErrorHandler = { subscriptionCallStack, error in + #if DEBUG + let serializedCallStack = subscriptionCallStack.joined(separator: "\n") + print("Unhandled error happened: \(error)\n subscription called from:\n\(serializedCallStack)") + #endif + } - let observer = AnonymousObserver { e in - switch e { - case .next(let value): - onNext?(value) - case .error(let e): - onError?(e) - disposable.dispose() - case .completed: - onCompleted?() - disposable.dispose() - } - } - return Disposables.create( - self.subscribeSafe(observer), - disposable - ) + /// Error handler called in case onError handler wasn't provided. + public static var defaultErrorHandler: DefaultErrorHandler { + get { + _lock.lock(); defer { _lock.unlock() } + return _defaultErrorHandler + } + set { + _lock.lock(); defer { _lock.unlock() } + _defaultErrorHandler = newValue } - #endif -} - -extension ObservableType { - /// All internal subscribe calls go through this method. - fileprivate func subscribeSafe(_ observer: O) -> Disposable where O.E == E { - return self.asObservable().subscribe(observer) } } + diff --git a/Pods/RxSwift/RxSwift/ObservableType.swift b/Pods/RxSwift/RxSwift/ObservableType.swift index 1fa3a336..e41a36a1 100644 --- a/Pods/RxSwift/RxSwift/ObservableType.swift +++ b/Pods/RxSwift/RxSwift/ObservableType.swift @@ -8,9 +8,6 @@ /// Represents a push style sequence. public protocol ObservableType : ObservableConvertibleType { - /// Type of elements in sequence. - associatedtype E - /** Subscribes `observer` to receive events for this sequence. diff --git a/Pods/RxSwift/RxSwift/Observables/Amb.swift b/Pods/RxSwift/RxSwift/Observables/Amb.swift index 69d39ba8..08ec04e1 100644 --- a/Pods/RxSwift/RxSwift/Observables/Amb.swift +++ b/Pods/RxSwift/RxSwift/Observables/Amb.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { /** Propagates the observable sequence that reacts first. @@ -14,8 +14,8 @@ extension Observable { - returns: An observable sequence that surfaces any of the given sequences, whichever reacted first. */ - public static func amb(_ sequence: S) -> Observable - where S.Iterator.Element == Observable { + public static func amb(_ sequence: S) -> Observable + where S.Iterator.Element == Observable { return sequence.reduce(Observable.never()) { a, o in return a.amb(o.asObservable()) } diff --git a/Pods/RxSwift/RxSwift/Observables/Catch.swift b/Pods/RxSwift/RxSwift/Observables/Catch.swift index 0c534fbe..187eb8a9 100644 --- a/Pods/RxSwift/RxSwift/Observables/Catch.swift +++ b/Pods/RxSwift/RxSwift/Observables/Catch.swift @@ -36,7 +36,7 @@ extension ObservableType { } -extension Observable { +extension ObservableType { /** Continues an observable sequence that is terminated by an error with the next observable sequence. @@ -44,8 +44,8 @@ extension Observable { - returns: An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully. */ - public static func catchError(_ sequence: S) -> Observable - where S.Iterator.Element == Observable { + public static func catchError(_ sequence: S) -> Observable + where S.Iterator.Element == Observable { return CatchSequence(sources: sequence) } } @@ -77,7 +77,7 @@ extension ObservableType { */ public func retry(_ maxAttemptCount: Int) -> Observable { - return CatchSequence(sources: repeatElement(self.asObservable(), count: maxAttemptCount)) + return CatchSequence(sources: Swift.repeatElement(self.asObservable(), count: maxAttemptCount)) } } diff --git a/Pods/RxSwift/RxSwift/Observables/CombineLatest+Collection.swift b/Pods/RxSwift/RxSwift/Observables/CombineLatest+Collection.swift index 9f713f6f..45e01737 100644 --- a/Pods/RxSwift/RxSwift/Observables/CombineLatest+Collection.swift +++ b/Pods/RxSwift/RxSwift/Observables/CombineLatest+Collection.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. @@ -15,7 +15,7 @@ extension Observable { - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - public static func combineLatest(_ collection: C, _ resultSelector: @escaping ([C.Iterator.Element.E]) throws -> Element) -> Observable + public static func combineLatest(_ collection: C, _ resultSelector: @escaping ([C.Iterator.Element.E]) throws -> E) -> Observable where C.Iterator.Element: ObservableType { return CombineLatestCollectionType(sources: collection, resultSelector: resultSelector) } @@ -27,8 +27,8 @@ extension Observable { - returns: An observable sequence containing the result of combining elements of the sources. */ - public static func combineLatest(_ collection: C) -> Observable<[Element]> - where C.Iterator.Element: ObservableType, C.Iterator.Element.E == Element { + public static func combineLatest(_ collection: C) -> Observable<[E]> + where C.Iterator.Element: ObservableType, C.Iterator.Element.E == E { return CombineLatestCollectionType(sources: collection, resultSelector: { $0 }) } } @@ -146,7 +146,7 @@ final fileprivate class CombineLatestCollectionType : Producer init(sources: C, resultSelector: @escaping ResultSelector) { _sources = sources _resultSelector = resultSelector - _count = Int(self._sources.count.toIntMax()) + _count = Int(Int64(self._sources.count)) } override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { diff --git a/Pods/RxSwift/RxSwift/Observables/CombineLatest+arity.swift b/Pods/RxSwift/RxSwift/Observables/CombineLatest+arity.swift index aac43a70..aad22554 100644 --- a/Pods/RxSwift/RxSwift/Observables/CombineLatest+arity.swift +++ b/Pods/RxSwift/RxSwift/Observables/CombineLatest+arity.swift @@ -11,7 +11,7 @@ // 2 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. @@ -109,7 +109,7 @@ final class CombineLatest2 : Producer { // 3 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. @@ -214,7 +214,7 @@ final class CombineLatest3 : Producer { // 4 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. @@ -326,7 +326,7 @@ final class CombineLatest4 : Producer { // 5 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. @@ -445,7 +445,7 @@ final class CombineLatest5 : Producer { // 6 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. @@ -571,7 +571,7 @@ final class CombineLatest6 : Producer { // 7 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. @@ -704,7 +704,7 @@ final class CombineLatest7 : Producer { // 8 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. diff --git a/Pods/RxSwift/RxSwift/Observables/Concat.swift b/Pods/RxSwift/RxSwift/Observables/Concat.swift index cc4174b8..35ef0e1f 100644 --- a/Pods/RxSwift/RxSwift/Observables/Concat.swift +++ b/Pods/RxSwift/RxSwift/Observables/Concat.swift @@ -21,7 +21,7 @@ extension ObservableType { } } -extension Observable { +extension ObservableType { /** Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. @@ -35,8 +35,8 @@ extension Observable { - returns: An observable sequence that contains the elements of each given sequence, in sequential order. */ - public static func concat(_ sequence: S) -> Observable - where S.Iterator.Element == Observable { + public static func concat(_ sequence: S) -> Observable + where S.Iterator.Element == Observable { return Concat(sources: sequence, count: nil) } @@ -53,9 +53,9 @@ extension Observable { - returns: An observable sequence that contains the elements of each given sequence, in sequential order. */ - public static func concat(_ collection: S) -> Observable - where S.Iterator.Element == Observable { - return Concat(sources: collection, count: collection.count.toIntMax()) + public static func concat(_ collection: S) -> Observable + where S.Iterator.Element == Observable { + return Concat(sources: collection, count: Int64(collection.count)) } /** @@ -71,8 +71,8 @@ extension Observable { - returns: An observable sequence that contains the elements of each given sequence, in sequential order. */ - public static func concat(_ sources: Observable ...) -> Observable { - return Concat(sources: sources, count: sources.count.toIntMax()) + public static func concat(_ sources: Observable ...) -> Observable { + return Concat(sources: sources, count: Int64(sources.count)) } } diff --git a/Pods/RxSwift/RxSwift/Observables/Create.swift b/Pods/RxSwift/RxSwift/Observables/Create.swift index 664daa1e..4a1804a7 100644 --- a/Pods/RxSwift/RxSwift/Observables/Create.swift +++ b/Pods/RxSwift/RxSwift/Observables/Create.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { // MARK: create /** diff --git a/Pods/RxSwift/RxSwift/Observables/Debug.swift b/Pods/RxSwift/RxSwift/Observables/Debug.swift index 1b7d2623..85b8af75 100644 --- a/Pods/RxSwift/RxSwift/Observables/Debug.swift +++ b/Pods/RxSwift/RxSwift/Observables/Debug.swift @@ -52,8 +52,8 @@ final fileprivate class DebugSink : Sin let maxEventTextLength = 40 let eventText = "\(event)" - let eventNormalized = (eventText.characters.count > maxEventTextLength) && _parent._trimOutput - ? String(eventText.characters.prefix(maxEventTextLength / 2)) + "..." + String(eventText.characters.suffix(maxEventTextLength / 2)) + let eventNormalized = (eventText.count > maxEventTextLength) && _parent._trimOutput + ? String(eventText.prefix(maxEventTextLength / 2)) + "..." + String(eventText.suffix(maxEventTextLength / 2)) : eventText logEvent(_parent._identifier, dateFormat: _timestampFormatter, content: "Event \(eventNormalized)") @@ -85,7 +85,7 @@ final fileprivate class Debug : Producer { else { let trimmedFile: String if let lastIndex = file.lastIndexOf("/") { - trimmedFile = file[file.index(after: lastIndex) ..< file.endIndex] + trimmedFile = String(file[file.index(after: lastIndex) ..< file.endIndex]) } else { trimmedFile = file diff --git a/Pods/RxSwift/RxSwift/Observables/Deferred.swift b/Pods/RxSwift/RxSwift/Observables/Deferred.swift index 6a0b2443..947f604a 100644 --- a/Pods/RxSwift/RxSwift/Observables/Deferred.swift +++ b/Pods/RxSwift/RxSwift/Observables/Deferred.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { /** Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes. diff --git a/Pods/RxSwift/RxSwift/Observables/Empty.swift b/Pods/RxSwift/RxSwift/Observables/Empty.swift index 1511a946..d2dcdb00 100644 --- a/Pods/RxSwift/RxSwift/Observables/Empty.swift +++ b/Pods/RxSwift/RxSwift/Observables/Empty.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { /** Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message. diff --git a/Pods/RxSwift/RxSwift/Observables/Enumerated.swift b/Pods/RxSwift/RxSwift/Observables/Enumerated.swift new file mode 100644 index 00000000..2a6cd980 --- /dev/null +++ b/Pods/RxSwift/RxSwift/Observables/Enumerated.swift @@ -0,0 +1,62 @@ +// +// Enumerated.swift +// RxSwift +// +// Created by Krunoslav Zaher on 8/6/17. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +extension ObservableType { + + /** + Enumerates the elements of an observable sequence. + + - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html) + + - returns: An observable sequence that contains tuples of source sequence elements and their indexes. + */ + public func enumerated() + -> Observable<(index: Int, element: E)> { + return Enumerated(source: self.asObservable()) + } +} + +final fileprivate class EnumeratedSink: Sink, ObserverType where O.E == (index: Int, element: Element) { + typealias E = Element + var index = 0 + + func on(_ event: Event) { + switch event { + case .next(let value): + do { + let nextIndex = try incrementChecked(&index) + let next = (index: nextIndex, element: value) + forwardOn(.next(next)) + } + catch let e { + forwardOn(.error(e)) + dispose() + } + case .completed: + forwardOn(.completed) + dispose() + case .error(let error): + forwardOn(.error(error)) + dispose() + } + } +} + +final fileprivate class Enumerated : Producer<(index: Int, element: Element)> { + private let _source: Observable + + init(source: Observable) { + _source = source + } + + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == (index: Int, element: Element) { + let sink = EnumeratedSink(observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) + } +} diff --git a/Pods/RxSwift/RxSwift/Observables/Error.swift b/Pods/RxSwift/RxSwift/Observables/Error.swift index c76068f0..a15942bb 100644 --- a/Pods/RxSwift/RxSwift/Observables/Error.swift +++ b/Pods/RxSwift/RxSwift/Observables/Error.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { /** Returns an observable sequence that terminates with an `error`. diff --git a/Pods/RxSwift/RxSwift/Observables/Filter.swift b/Pods/RxSwift/RxSwift/Observables/Filter.swift index 8cf8c0d5..2a1f496a 100644 --- a/Pods/RxSwift/RxSwift/Observables/Filter.swift +++ b/Pods/RxSwift/RxSwift/Observables/Filter.swift @@ -32,10 +32,11 @@ extension ObservableType { - returns: An observable sequence that skips all elements of the source sequence. */ public func ignoreElements() - -> Observable { - return filter { _ -> Bool in - return false + -> Completable { + return flatMap { _ in + return Observable.empty() } + .asCompletable() } } diff --git a/Pods/RxSwift/RxSwift/Observables/First.swift b/Pods/RxSwift/RxSwift/Observables/First.swift new file mode 100644 index 00000000..4a72ba0d --- /dev/null +++ b/Pods/RxSwift/RxSwift/Observables/First.swift @@ -0,0 +1,42 @@ +// +// First.swift +// RxSwift +// +// Created by Krunoslav Zaher on 7/31/17. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +fileprivate final class FirstSink : Sink, ObserverType where O.E == Element? { + typealias E = Element + typealias Parent = First + + func on(_ event: Event) { + switch event { + case .next(let value): + forwardOn(.next(value)) + forwardOn(.completed) + dispose() + case .error(let error): + forwardOn(.error(error)) + dispose() + case .completed: + forwardOn(.next(nil)) + forwardOn(.completed) + dispose() + } + } +} + +final class First: Producer { + fileprivate let _source: Observable + + init(source: Observable) { + _source = source + } + + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element? { + let sink = FirstSink(observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) + } +} diff --git a/Pods/RxSwift/RxSwift/Observables/Generate.swift b/Pods/RxSwift/RxSwift/Observables/Generate.swift index db5b6488..6469937d 100644 --- a/Pods/RxSwift/RxSwift/Observables/Generate.swift +++ b/Pods/RxSwift/RxSwift/Observables/Generate.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { /** Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to run the loop send out observer messages. diff --git a/Pods/RxSwift/RxSwift/Observables/Just.swift b/Pods/RxSwift/RxSwift/Observables/Just.swift index 3beb04b9..443cdaaf 100644 --- a/Pods/RxSwift/RxSwift/Observables/Just.swift +++ b/Pods/RxSwift/RxSwift/Observables/Just.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { /** Returns an observable sequence that contains a single element. diff --git a/Pods/RxSwift/RxSwift/Observables/Map.swift b/Pods/RxSwift/RxSwift/Observables/Map.swift index d743c26c..df0e0d1a 100644 --- a/Pods/RxSwift/RxSwift/Observables/Map.swift +++ b/Pods/RxSwift/RxSwift/Observables/Map.swift @@ -21,19 +21,6 @@ extension ObservableType { -> Observable { return self.asObservable().composeMap(transform) } - - /** - Projects each element of an observable sequence into a new form by incorporating the element's index. - - - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html) - - - parameter selector: A transform function to apply to each source element; the second parameter of the function represents the index of the source element. - - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source. - */ - public func mapWithIndex(_ selector: @escaping (E, Int) throws -> R) - -> Observable { - return MapWithIndex(source: asObservable(), selector: selector) - } } final fileprivate class MapSink : Sink, ObserverType { @@ -70,62 +57,6 @@ final fileprivate class MapSink : Sink, Observe } } -final fileprivate class MapWithIndexSink : Sink, ObserverType { - typealias Selector = (SourceType, Int) throws -> ResultType - - typealias ResultType = O.E - typealias Element = SourceType - typealias Parent = MapWithIndex - - private let _selector: Selector - - private var _index = 0 - - init(selector: @escaping Selector, observer: O, cancel: Cancelable) { - _selector = selector - super.init(observer: observer, cancel: cancel) - } - - func on(_ event: Event) { - switch event { - case .next(let element): - do { - let mappedElement = try _selector(element, try incrementChecked(&_index)) - forwardOn(.next(mappedElement)) - } - catch let e { - forwardOn(.error(e)) - dispose() - } - case .error(let error): - forwardOn(.error(error)) - dispose() - case .completed: - forwardOn(.completed) - dispose() - } - } -} - -final fileprivate class MapWithIndex : Producer { - typealias Selector = (SourceType, Int) throws -> ResultType - - private let _source: Observable - - private let _selector: Selector - - init(source: Observable, selector: @escaping Selector) { - _source = source - _selector = selector - } - - override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == ResultType { - let sink = MapWithIndexSink(selector: _selector, observer: observer, cancel: cancel) - let subscription = _source.subscribe(sink) - return (sink: sink, subscription: subscription) - } -} - #if TRACE_RESOURCES fileprivate var _numberOfMapOperators: AtomicInt = 0 extension Resources { diff --git a/Pods/RxSwift/RxSwift/Observables/Merge.swift b/Pods/RxSwift/RxSwift/Observables/Merge.swift index 317babc7..7ba17dd5 100644 --- a/Pods/RxSwift/RxSwift/Observables/Merge.swift +++ b/Pods/RxSwift/RxSwift/Observables/Merge.swift @@ -21,18 +21,6 @@ extension ObservableType { return FlatMap(source: asObservable(), selector: selector) } - /** - Projects each element of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence. - - - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html) - - - parameter selector: A transform function to apply to each element; the second parameter of the function represents the index of the source element. - - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence. - */ - public func flatMapWithIndex(_ selector: @escaping (E, Int) throws -> O) - -> Observable { - return FlatMapWithIndex(source: asObservable(), selector: selector) - } } extension ObservableType { @@ -93,7 +81,7 @@ extension ObservableType where E : ObservableConvertibleType { } } -extension Observable { +extension ObservableType { /** Merges elements from all observable sequences from collection into a single observable sequence. @@ -367,22 +355,6 @@ fileprivate final class FlatMapSink : MergeSink where Observer.E == SourceSequence.E { - typealias Selector = (SourceElement, Int) throws -> SourceSequence - - private var _index = 0 - private let _selector: Selector - - init(selector: @escaping Selector, observer: Observer, cancel: Cancelable) { - _selector = selector - super.init(observer: observer, cancel: cancel) - } - - override func performMap(_ element: SourceElement) throws -> SourceSequence { - return try _selector(element, try incrementChecked(&_index)) - } -} - // MARK: FlatMapFirst fileprivate final class FlatMapFirstSink : MergeSink where Observer.E == SourceSequence.E { @@ -562,26 +534,6 @@ final fileprivate class FlatMap: Producer { - typealias Selector = (SourceElement, Int) throws -> SourceSequence - - private let _source: Observable - - private let _selector: Selector - - init(source: Observable, selector: @escaping Selector) { - _source = source - _selector = selector - } - - override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceSequence.E { - let sink = FlatMapWithIndexSink(selector: _selector, observer: observer, cancel: cancel) - let subscription = sink.run(_source) - return (sink: sink, subscription: subscription) - } - -} - final fileprivate class FlatMapFirst: Producer { typealias Selector = (SourceElement) throws -> SourceSequence diff --git a/Pods/RxSwift/RxSwift/Observables/Multicast.swift b/Pods/RxSwift/RxSwift/Observables/Multicast.swift index 525f24ef..a027c4f6 100644 --- a/Pods/RxSwift/RxSwift/Observables/Multicast.swift +++ b/Pods/RxSwift/RxSwift/Observables/Multicast.swift @@ -60,7 +60,7 @@ extension ObservableType { - returns: A connectable observable sequence that shares a single subscription to the underlying sequence. */ public func publish() -> ConnectableObservable { - return self.multicast(PublishSubject()) + return self.multicast { PublishSubject() } } } @@ -78,7 +78,7 @@ extension ObservableType { */ public func replay(_ bufferSize: Int) -> ConnectableObservable { - return self.multicast(ReplaySubject.create(bufferSize: bufferSize)) + return self.multicast { ReplaySubject.create(bufferSize: bufferSize) } } /** @@ -92,7 +92,7 @@ extension ObservableType { */ public func replayAll() -> ConnectableObservable { - return self.multicast(ReplaySubject.createUnbounded()) + return self.multicast { ReplaySubject.createUnbounded() } } } @@ -101,7 +101,7 @@ extension ConnectableObservableType { /** Returns an observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence. - - seealso: [refCount operator on reactivex.io](http://reactivex.io/documentation/operators/refCount.html) + - seealso: [refCount operator on reactivex.io](http://reactivex.io/documentation/operators/refcount.html) - returns: An observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence. */ @@ -110,22 +110,6 @@ extension ConnectableObservableType { } } -extension ObservableType { - - /** - Returns an observable sequence that shares a single subscription to the underlying sequence. - - This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed. - - - seealso: [share operator on reactivex.io](http://reactivex.io/documentation/operators/refcount.html) - - - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence. - */ - public func share() -> Observable { - return self.publish().refCount() - } -} - extension ObservableType { /** diff --git a/Pods/RxSwift/RxSwift/Observables/Never.swift b/Pods/RxSwift/RxSwift/Observables/Never.swift index 4cb9b87b..d98a7a8f 100644 --- a/Pods/RxSwift/RxSwift/Observables/Never.swift +++ b/Pods/RxSwift/RxSwift/Observables/Never.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { /** Returns a non-terminating observable sequence, which can be used to denote an infinite duration. diff --git a/Pods/RxSwift/RxSwift/Observables/ObserveOn.swift b/Pods/RxSwift/RxSwift/Observables/ObserveOn.swift index fd8ce337..ce2a0d45 100644 --- a/Pods/RxSwift/RxSwift/Observables/ObserveOn.swift +++ b/Pods/RxSwift/RxSwift/Observables/ObserveOn.swift @@ -102,7 +102,7 @@ final fileprivate class ObserveOnSink : ObserverBase { } } - func run(_ state: Void, recurse: (Void) -> Void) { + func run(_ state: (), _ recurse: (()) -> ()) { let (nextEvent, observer) = self._lock.calculateLocked { () -> (Event?, O) in if self._queue.count > 0 { return (self._queue.dequeue(), self._observer) @@ -112,7 +112,7 @@ final fileprivate class ObserveOnSink : ObserverBase { return (nil, self._observer) } } - + if let nextEvent = nextEvent, !_cancel.isDisposed { observer.on(nextEvent) if nextEvent.isStopEvent { @@ -122,11 +122,11 @@ final fileprivate class ObserveOnSink : ObserverBase { else { return } - + let shouldContinue = _shouldContinue_synchronized() - + if shouldContinue { - recurse() + recurse(()) } } @@ -170,7 +170,7 @@ final fileprivate class ObserveOnSerialDispatchQueueSink : Obse let cancel: Cancelable - var cachedScheduleLambda: ((ObserveOnSerialDispatchQueueSink, Event) -> Disposable)! + var cachedScheduleLambda: (((sink: ObserveOnSerialDispatchQueueSink, event: Event)) -> Disposable)! init(scheduler: SerialDispatchQueueScheduler, observer: O, cancel: Cancelable) { self.scheduler = scheduler @@ -178,11 +178,11 @@ final fileprivate class ObserveOnSerialDispatchQueueSink : Obse self.cancel = cancel super.init() - cachedScheduleLambda = { sink, event in - sink.observer.on(event) + cachedScheduleLambda = { pair in + pair.sink.observer.on(pair.event) - if event.isStopEvent { - sink.dispose() + if pair.event.isStopEvent { + pair.sink.dispose() } return Disposables.create() @@ -190,7 +190,7 @@ final fileprivate class ObserveOnSerialDispatchQueueSink : Obse } override func onCore(_ event: Event) { - let _ = self.scheduler.schedule((self, event), action: cachedScheduleLambda) + let _ = self.scheduler.schedule((self, event), action: cachedScheduleLambda!) } override func dispose() { diff --git a/Pods/RxSwift/RxSwift/Observables/Optional.swift b/Pods/RxSwift/RxSwift/Observables/Optional.swift index fa74c04b..52ba0d9d 100644 --- a/Pods/RxSwift/RxSwift/Observables/Optional.swift +++ b/Pods/RxSwift/RxSwift/Observables/Optional.swift @@ -6,7 +6,7 @@ // Copyright © 2016 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { /** Converts a optional to an observable sequence. diff --git a/Pods/RxSwift/RxSwift/Observables/Range.swift b/Pods/RxSwift/RxSwift/Observables/Range.swift index 2ebaca2e..9b85554e 100644 --- a/Pods/RxSwift/RxSwift/Observables/Range.swift +++ b/Pods/RxSwift/RxSwift/Observables/Range.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable where Element : SignedInteger { +extension ObservableType where E : RxAbstractInteger { /** Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to generate and send out observer messages. @@ -22,7 +22,7 @@ extension Observable where Element : SignedInteger { } } -final fileprivate class RangeProducer : Producer { +final fileprivate class RangeProducer : Producer { fileprivate let _start: E fileprivate let _count: E fileprivate let _scheduler: ImmediateSchedulerType @@ -48,7 +48,7 @@ final fileprivate class RangeProducer : Producer { } } -final fileprivate class RangeSink : Sink where O.E: SignedInteger { +final fileprivate class RangeSink : Sink where O.E: RxAbstractInteger { typealias Parent = RangeProducer private let _parent: Parent diff --git a/Pods/RxSwift/RxSwift/Observables/Repeat.swift b/Pods/RxSwift/RxSwift/Observables/Repeat.swift index 3ed7165b..6892ec12 100644 --- a/Pods/RxSwift/RxSwift/Observables/Repeat.swift +++ b/Pods/RxSwift/RxSwift/Observables/Repeat.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { /** Generates an observable sequence that repeats the given element infinitely, using the specified scheduler to send out observer messages. diff --git a/Pods/RxSwift/RxSwift/Observables/Sequence.swift b/Pods/RxSwift/RxSwift/Observables/Sequence.swift index eb4daed1..e141bc72 100644 --- a/Pods/RxSwift/RxSwift/Observables/Sequence.swift +++ b/Pods/RxSwift/RxSwift/Observables/Sequence.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { // MARK: of /** @@ -23,7 +23,7 @@ extension Observable { } } -extension Observable { +extension ObservableType { /** Converts an array to an observable sequence. diff --git a/Pods/RxSwift/RxSwift/Observables/ShareReplayScope.swift b/Pods/RxSwift/RxSwift/Observables/ShareReplayScope.swift index ee5e8f89..8ba2898d 100644 --- a/Pods/RxSwift/RxSwift/Observables/ShareReplayScope.swift +++ b/Pods/RxSwift/RxSwift/Observables/ShareReplayScope.swift @@ -138,13 +138,13 @@ extension ObservableType { - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence. */ - public func share(replay: Int = 0, scope: SubjectLifetimeScope) + public func share(replay: Int = 0, scope: SubjectLifetimeScope = .whileConnected) -> Observable { switch scope { case .forever: switch replay { case 0: return self.multicast(PublishSubject()).refCount() - default: return shareReplay(replay) + default: return self.multicast(ReplaySubject.create(bufferSize: replay)).refCount() } case .whileConnected: switch replay { @@ -156,44 +156,6 @@ extension ObservableType { } } -extension ObservableType { - - /** - Returns an observable sequence that shares a single subscription to the underlying sequence, and immediately upon subscription replays latest element in buffer. - - This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed. - - Unlike `shareReplay(bufferSize: Int)`, this operator will clear latest element from replay buffer in case number of subscribers drops from one to zero. In case sequence - completes or errors out replay buffer is also cleared. - - - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html) - - - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence. - */ - public func shareReplayLatestWhileConnected() - -> Observable { - return ShareReplay1WhileConnected(source: self.asObservable()) - } -} - -extension ObservableType { - - /** - Returns an observable sequence that shares a single subscription to the underlying sequence, and immediately upon subscription replays maximum number of elements in buffer. - - This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed. - - - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html) - - - parameter bufferSize: Maximum element count of the replay buffer. - - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence. - */ - public func shareReplay(_ bufferSize: Int) - -> Observable { - return self.replay(bufferSize).refCount() - } -} - fileprivate final class ShareReplay1WhileConnectedConnection : ObserverType , SynchronizedUnsubscribeType { diff --git a/Pods/RxSwift/RxSwift/Observables/Skip.swift b/Pods/RxSwift/RxSwift/Observables/Skip.swift index 1226bf89..fcac9d4a 100644 --- a/Pods/RxSwift/RxSwift/Observables/Skip.swift +++ b/Pods/RxSwift/RxSwift/Observables/Skip.swift @@ -129,7 +129,7 @@ final fileprivate class SkipTimeSink : Sink, Ob } func run() -> Disposable { - let disposeTimer = parent.scheduler.scheduleRelative((), dueTime: self.parent.duration) { + let disposeTimer = parent.scheduler.scheduleRelative((), dueTime: self.parent.duration) { _ in self.tick() return Disposables.create() } diff --git a/Pods/RxSwift/RxSwift/Observables/SkipWhile.swift b/Pods/RxSwift/RxSwift/Observables/SkipWhile.swift index 42bf9bc5..4bb394b9 100644 --- a/Pods/RxSwift/RxSwift/Observables/SkipWhile.swift +++ b/Pods/RxSwift/RxSwift/Observables/SkipWhile.swift @@ -19,19 +19,6 @@ extension ObservableType { public func skipWhile(_ predicate: @escaping (E) throws -> Bool) -> Observable { return SkipWhile(source: asObservable(), predicate: predicate) } - - /** - Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements. - The element's index is used in the logic of the predicate function. - - - seealso: [skipWhile operator on reactivex.io](http://reactivex.io/documentation/operators/skipwhile.html) - - - parameter predicate: A function to test each element for a condition; the second parameter of the function represents the index of the source element. - - returns: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate. - */ - public func skipWhileWithIndex(_ predicate: @escaping (E, Int) throws -> Bool) -> Observable { - return SkipWhile(source: asObservable(), predicate: predicate) - } } final fileprivate class SkipWhileSink : Sink, ObserverType { @@ -70,74 +57,21 @@ final fileprivate class SkipWhileSink : Sink, ObserverType { } } -final fileprivate class SkipWhileSinkWithIndex : Sink, ObserverType { - - typealias Element = O.E - typealias Parent = SkipWhile - - fileprivate let _parent: Parent - fileprivate var _index = 0 - fileprivate var _running = false - - init(parent: Parent, observer: O, cancel: Cancelable) { - _parent = parent - super.init(observer: observer, cancel: cancel) - } - - func on(_ event: Event) { - switch event { - case .next(let value): - if !_running { - do { - _running = try !_parent._predicateWithIndex(value, _index) - let _ = try incrementChecked(&_index) - } catch let e { - forwardOn(.error(e)) - dispose() - return - } - } - - if _running { - forwardOn(.next(value)) - } - case .error, .completed: - forwardOn(event) - dispose() - } - } -} - final fileprivate class SkipWhile: Producer { typealias Predicate = (Element) throws -> Bool typealias PredicateWithIndex = (Element, Int) throws -> Bool fileprivate let _source: Observable - fileprivate let _predicate: Predicate! - fileprivate let _predicateWithIndex: PredicateWithIndex! + fileprivate let _predicate: Predicate init(source: Observable, predicate: @escaping Predicate) { _source = source _predicate = predicate - _predicateWithIndex = nil - } - - init(source: Observable, predicate: @escaping PredicateWithIndex) { - _source = source - _predicate = nil - _predicateWithIndex = predicate } override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { - if let _ = _predicate { - let sink = SkipWhileSink(parent: self, observer: observer, cancel: cancel) - let subscription = _source.subscribe(sink) - return (sink: sink, subscription: subscription) - } - else { - let sink = SkipWhileSinkWithIndex(parent: self, observer: observer, cancel: cancel) - let subscription = _source.subscribe(sink) - return (sink: sink, subscription: subscription) - } + let sink = SkipWhileSink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } diff --git a/Pods/RxSwift/RxSwift/Observables/Take.swift b/Pods/RxSwift/RxSwift/Observables/Take.swift index a7fbe852..661f8582 100644 --- a/Pods/RxSwift/RxSwift/Observables/Take.swift +++ b/Pods/RxSwift/RxSwift/Observables/Take.swift @@ -148,7 +148,7 @@ final fileprivate class TakeTimeSink } func run() -> Disposable { - let disposeTimer = _parent._scheduler.scheduleRelative((), dueTime: _parent._duration) { + let disposeTimer = _parent._scheduler.scheduleRelative((), dueTime: _parent._duration) { _ in self.tick() return Disposables.create() } diff --git a/Pods/RxSwift/RxSwift/Observables/TakeWhile.swift b/Pods/RxSwift/RxSwift/Observables/TakeWhile.swift index 45521fb4..2b7b5510 100644 --- a/Pods/RxSwift/RxSwift/Observables/TakeWhile.swift +++ b/Pods/RxSwift/RxSwift/Observables/TakeWhile.swift @@ -20,21 +20,6 @@ extension ObservableType { -> Observable { return TakeWhile(source: asObservable(), predicate: predicate) } - - /** - Returns elements from an observable sequence as long as a specified condition is true. - - The element's index is used in the logic of the predicate function. - - - seealso: [takeWhile operator on reactivex.io](http://reactivex.io/documentation/operators/takewhile.html) - - - parameter predicate: A function to test each element for a condition; the second parameter of the function represents the index of the source element. - - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes. - */ - public func takeWhileWithIndex(_ predicate: @escaping (E, Int) throws -> Bool) - -> Observable { - return TakeWhile(source: asObservable(), predicate: predicate) - } } final fileprivate class TakeWhileSink @@ -81,81 +66,20 @@ final fileprivate class TakeWhileSink } -final fileprivate class TakeWhileSinkWithIndex - : Sink - , ObserverType { - typealias Element = O.E - typealias Parent = TakeWhile - - fileprivate let _parent: Parent - - fileprivate var _running = true - fileprivate var _index = 0 - - init(parent: Parent, observer: O, cancel: Cancelable) { - _parent = parent - super.init(observer: observer, cancel: cancel) - } - - func on(_ event: Event) { - switch event { - case .next(let value): - if !_running { - return - } - - do { - _running = try _parent._predicateWithIndex(value, _index) - let _ = try incrementChecked(&_index) - } catch let e { - forwardOn(.error(e)) - dispose() - return - } - - if _running { - forwardOn(.next(value)) - } else { - forwardOn(.completed) - dispose() - } - case .error, .completed: - forwardOn(event) - dispose() - } - } - -} - final fileprivate class TakeWhile: Producer { typealias Predicate = (Element) throws -> Bool - typealias PredicateWithIndex = (Element, Int) throws -> Bool fileprivate let _source: Observable - fileprivate let _predicate: Predicate! - fileprivate let _predicateWithIndex: PredicateWithIndex! + fileprivate let _predicate: Predicate init(source: Observable, predicate: @escaping Predicate) { _source = source _predicate = predicate - _predicateWithIndex = nil - } - - init(source: Observable, predicate: @escaping PredicateWithIndex) { - _source = source - _predicate = nil - _predicateWithIndex = predicate } - + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { - if let _ = _predicate { - let sink = TakeWhileSink(parent: self, observer: observer, cancel: cancel) - let subscription = _source.subscribe(sink) - return (sink: sink, subscription: subscription) - } else { - let sink = TakeWhileSinkWithIndex(parent: self, observer: observer, cancel: cancel) - let subscription = _source.subscribe(sink) - return (sink: sink, subscription: subscription) - } + let sink = TakeWhileSink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } diff --git a/Pods/RxSwift/RxSwift/Observables/Timer.swift b/Pods/RxSwift/RxSwift/Observables/Timer.swift index f62be1cc..dec69e12 100644 --- a/Pods/RxSwift/RxSwift/Observables/Timer.swift +++ b/Pods/RxSwift/RxSwift/Observables/Timer.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable where Element : SignedInteger { +extension ObservableType where E : RxAbstractInteger { /** Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages. @@ -25,7 +25,7 @@ extension Observable where Element : SignedInteger { } } -extension Observable where Element: SignedInteger { +extension ObservableType where E: RxAbstractInteger { /** Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers. @@ -46,7 +46,7 @@ extension Observable where Element: SignedInteger { } } -final fileprivate class TimerSink : Sink where O.E : SignedInteger { +final fileprivate class TimerSink : Sink where O.E : RxAbstractInteger { typealias Parent = Timer private let _parent: Parent @@ -64,7 +64,7 @@ final fileprivate class TimerSink : Sink where O.E : SignedI } } -final fileprivate class TimerOneOffSink : Sink where O.E : SignedInteger { +final fileprivate class TimerOneOffSink : Sink where O.E : RxAbstractInteger { typealias Parent = Timer private let _parent: Parent @@ -85,7 +85,7 @@ final fileprivate class TimerOneOffSink : Sink where O.E : S } } -final fileprivate class Timer: Producer { +final fileprivate class Timer: Producer { fileprivate let _scheduler: SchedulerType fileprivate let _dueTime: RxTimeInterval fileprivate let _period: RxTimeInterval? diff --git a/Pods/RxSwift/RxSwift/Observables/Using.swift b/Pods/RxSwift/RxSwift/Observables/Using.swift index 6c32a98b..8ea83267 100644 --- a/Pods/RxSwift/RxSwift/Observables/Using.swift +++ b/Pods/RxSwift/RxSwift/Observables/Using.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { /** Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime. diff --git a/Pods/RxSwift/RxSwift/Observables/WithLatestFrom.swift b/Pods/RxSwift/RxSwift/Observables/WithLatestFrom.swift index 35205e4f..bd22e2f0 100644 --- a/Pods/RxSwift/RxSwift/Observables/WithLatestFrom.swift +++ b/Pods/RxSwift/RxSwift/Observables/WithLatestFrom.swift @@ -22,7 +22,7 @@ extension ObservableType { } /** - Merges two observable sequences into one observable sequence by using latest element from the second sequence every time when `self` emitts an element. + Merges two observable sequences into one observable sequence by using latest element from the second sequence every time when `self` emits an element. - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html) diff --git a/Pods/RxSwift/RxSwift/Observables/Zip+Collection.swift b/Pods/RxSwift/RxSwift/Observables/Zip+Collection.swift index 6559491b..11f25fc3 100644 --- a/Pods/RxSwift/RxSwift/Observables/Zip+Collection.swift +++ b/Pods/RxSwift/RxSwift/Observables/Zip+Collection.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -15,7 +15,7 @@ extension Observable { - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - public static func zip(_ collection: C, _ resultSelector: @escaping ([C.Iterator.Element.E]) throws -> Element) -> Observable + public static func zip(_ collection: C, _ resultSelector: @escaping ([C.Iterator.Element.E]) throws -> E) -> Observable where C.Iterator.Element: ObservableType { return ZipCollectionType(sources: collection, resultSelector: resultSelector) } @@ -27,8 +27,8 @@ extension Observable { - returns: An observable sequence containing the result of combining elements of the sources. */ - public static func zip(_ collection: C) -> Observable<[Element]> - where C.Iterator.Element: ObservableType, C.Iterator.Element.E == Element { + public static func zip(_ collection: C) -> Observable<[E]> + where C.Iterator.Element: ObservableType, C.Iterator.Element.E == E { return ZipCollectionType(sources: collection, resultSelector: { $0 }) } @@ -158,7 +158,7 @@ final fileprivate class ZipCollectionType : Producer where init(sources: C, resultSelector: @escaping ResultSelector) { self.sources = sources self.resultSelector = resultSelector - self.count = Int(self.sources.count.toIntMax()) + self.count = Int(Int64(self.sources.count)) } override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { diff --git a/Pods/RxSwift/RxSwift/Observables/Zip+arity.swift b/Pods/RxSwift/RxSwift/Observables/Zip+arity.swift index 602b49ef..04bf68f9 100644 --- a/Pods/RxSwift/RxSwift/Observables/Zip+arity.swift +++ b/Pods/RxSwift/RxSwift/Observables/Zip+arity.swift @@ -11,7 +11,7 @@ // 2 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -121,7 +121,7 @@ final class Zip2 : Producer { // 3 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -239,7 +239,7 @@ final class Zip3 : Producer { // 4 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -365,7 +365,7 @@ final class Zip4 : Producer { // 5 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -499,7 +499,7 @@ final class Zip5 : Producer { // 6 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -641,7 +641,7 @@ final class Zip6 : Producer { // 7 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -791,7 +791,7 @@ final class Zip7 : Producer { // 8 -extension Observable { +extension ObservableType { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. diff --git a/Pods/RxSwift/RxSwift/ObserverType.swift b/Pods/RxSwift/RxSwift/ObserverType.swift index 21a5722c..e3ed7aa8 100644 --- a/Pods/RxSwift/RxSwift/ObserverType.swift +++ b/Pods/RxSwift/RxSwift/ObserverType.swift @@ -23,18 +23,18 @@ extension ObserverType { /// Convenience method equivalent to `on(.next(element: E))` /// /// - parameter element: Next element to send to observer(s) - public final func onNext(_ element: E) { + public func onNext(_ element: E) { on(.next(element)) } /// Convenience method equivalent to `on(.completed)` - public final func onCompleted() { + public func onCompleted() { on(.completed) } /// Convenience method equivalent to `on(.error(Swift.Error))` /// - parameter error: Swift.Error to send to observer(s) - public final func onError(_ error: Swift.Error) { + public func onError(_ error: Swift.Error) { on(.error(error)) } } diff --git a/Pods/RxSwift/RxSwift/Observers/TailRecursiveSink.swift b/Pods/RxSwift/RxSwift/Observers/TailRecursiveSink.swift index 332e6d2e..48a599dd 100644 --- a/Pods/RxSwift/RxSwift/Observers/TailRecursiveSink.swift +++ b/Pods/RxSwift/RxSwift/Observers/TailRecursiveSink.swift @@ -143,6 +143,7 @@ class TailRecursiveSink super.dispose() _subscription.dispose() + _gate.dispose() schedule(.dispose) } diff --git a/Pods/RxSwift/RxSwift/Rx.swift b/Pods/RxSwift/RxSwift/Rx.swift index cda826cf..bbce79fc 100644 --- a/Pods/RxSwift/RxSwift/Rx.swift +++ b/Pods/RxSwift/RxSwift/Rx.swift @@ -93,7 +93,7 @@ func decrementChecked(_ i: inout Int) throws -> Int { if count > 1 { synchronizationError( - "⚠️ Reentrancy anomaly was detected. ⚠️\n" + + "⚠️ Reentrancy anomaly was detected.\n" + " > Debugging: To debug this issue you can set a breakpoint in \(#file):\(#line) and observe the call stack.\n" + " > Problem: This behavior is breaking the observable sequence grammar. `next (error | completed)?`\n" + " This behavior breaks the grammar because there is overlapping between sequence events.\n" + @@ -109,7 +109,7 @@ func decrementChecked(_ i: inout Int) throws -> Int { if _threads.count > 1 { synchronizationError( - "⚠️ Synchronization anomaly was detected. ⚠️\n" + + "⚠️ Synchronization anomaly was detected.\n" + " > Debugging: To debug this issue you can set a breakpoint in \(#file):\(#line) and observe the call stack.\n" + " > Problem: This behavior is breaking the observable sequence grammar. `next (error | completed)?`\n" + " This behavior breaks the grammar because there is overlapping between sequence events.\n" + @@ -132,3 +132,11 @@ func decrementChecked(_ i: inout Int) throws -> Int { } #endif + +/// RxSwift global hooks +public enum Hooks { + + // Should capture call stack + public static var recordCallStackOnError: Bool = false + +} diff --git a/Pods/RxSwift/RxSwift/Schedulers/CurrentThreadScheduler.swift b/Pods/RxSwift/RxSwift/Schedulers/CurrentThreadScheduler.swift index cbdb98d9..2fe822d9 100644 --- a/Pods/RxSwift/RxSwift/Schedulers/CurrentThreadScheduler.swift +++ b/Pods/RxSwift/RxSwift/Schedulers/CurrentThreadScheduler.swift @@ -50,7 +50,11 @@ public class CurrentThreadScheduler : ImmediateSchedulerType { private static var isScheduleRequiredKey: pthread_key_t = { () -> pthread_key_t in let key = UnsafeMutablePointer.allocate(capacity: 1) - if pthread_key_create(key, nil) != 0 { + defer { + key.deallocate(capacity: 1) + } + + guard pthread_key_create(key, nil) == 0 else { rxFatalError("isScheduleRequired key creation failed") } diff --git a/Pods/RxSwift/RxSwift/Schedulers/ImmediateScheduler.swift b/Pods/RxSwift/RxSwift/Schedulers/ImmediateScheduler.swift deleted file mode 100644 index f6b5db94..00000000 --- a/Pods/RxSwift/RxSwift/Schedulers/ImmediateScheduler.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// ImmediateScheduler.swift -// RxSwift -// -// Created by Krunoslav Zaher on 10/17/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -/// Represents an object that schedules units of work to run immediately on the current thread. -private final class ImmediateScheduler : ImmediateSchedulerType { - - private let _asyncLock = AsyncLock() - - /** - Schedules an action to be executed immediately. - - In case `schedule` is called recursively from inside of `action` callback, scheduled `action` will be enqueued - and executed after current `action`. (`AsyncLock` behavior) - - - parameter state: State passed to the action to be executed. - - parameter action: Action to be executed. - - returns: The disposable object used to cancel the scheduled action (best effort). - */ - func schedule(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable { - let disposable = SingleAssignmentDisposable() - _asyncLock.invoke(AnonymousInvocable { - if disposable.isDisposed { - return - } - disposable.setDisposable(action(state)) - }) - - return disposable - } -} diff --git a/Pods/RxSwift/RxSwift/Schedulers/Internal/AnonymousInvocable.swift b/Pods/RxSwift/RxSwift/Schedulers/Internal/AnonymousInvocable.swift deleted file mode 100644 index 8d1d965b..00000000 --- a/Pods/RxSwift/RxSwift/Schedulers/Internal/AnonymousInvocable.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// AnonymousInvocable.swift -// RxSwift -// -// Created by Krunoslav Zaher on 11/7/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -struct AnonymousInvocable : InvocableType { - private let _action: () -> () - - init(_ action: @escaping () -> ()) { - _action = action - } - - func invoke() { - _action() - } -} diff --git a/Pods/RxSwift/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift b/Pods/RxSwift/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift index dc191b15..b82f0113 100644 --- a/Pods/RxSwift/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift +++ b/Pods/RxSwift/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift @@ -43,7 +43,11 @@ extension DispatchQueueConfiguration { let compositeDisposable = CompositeDisposable() let timer = DispatchSource.makeTimerSource(queue: queue) - timer.scheduleOneshot(deadline: deadline) + #if swift(>=4.0) + timer.schedule(deadline: deadline, leeway: leeway) + #else + timer.scheduleOneshot(deadline: deadline, leeway: leeway) + #endif // TODO: // This looks horrible, and yes, it is. @@ -77,8 +81,12 @@ extension DispatchQueueConfiguration { var timerState = state let timer = DispatchSource.makeTimerSource(queue: queue) - timer.scheduleRepeating(deadline: initial, interval: dispatchInterval(period), leeway: leeway) - + #if swift(>=4.0) + timer.schedule(deadline: initial, repeating: dispatchInterval(period), leeway: leeway) + #else + timer.scheduleRepeating(deadline: initial, interval: dispatchInterval(period), leeway: leeway) + #endif + // TODO: // This looks horrible, and yes, it is. // It looks like Apple has made a conceputal change here, and I'm unsure why. diff --git a/Pods/RxSwift/RxSwift/Schedulers/MainScheduler.swift b/Pods/RxSwift/RxSwift/Schedulers/MainScheduler.swift index 7d2ac218..e219e4ec 100644 --- a/Pods/RxSwift/RxSwift/Schedulers/MainScheduler.swift +++ b/Pods/RxSwift/RxSwift/Schedulers/MainScheduler.swift @@ -40,7 +40,7 @@ public final class MainScheduler : SerialDispatchQueueScheduler { /// In case this method is called on a background thread it will throw an exception. public class func ensureExecutingOnScheduler(errorMessage: String? = nil) { if !DispatchQueue.isMain { - rxFatalError(errorMessage ?? "Executing on backgound thread. Please use `MainScheduler.instance.schedule` to schedule work on main thread.") + rxFatalError(errorMessage ?? "Executing on background thread. Please use `MainScheduler.instance.schedule` to schedule work on main thread.") } } diff --git a/Pods/RxSwift/RxSwift/Subjects/Variable.swift b/Pods/RxSwift/RxSwift/Subjects/Variable.swift deleted file mode 100644 index ba058f87..00000000 --- a/Pods/RxSwift/RxSwift/Subjects/Variable.swift +++ /dev/null @@ -1,67 +0,0 @@ -// -// Variable.swift -// RxSwift -// -// Created by Krunoslav Zaher on 3/28/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -/// Variable is a wrapper for `BehaviorSubject`. -/// -/// Unlike `BehaviorSubject` it can't terminate with error, and when variable is deallocated -/// it will complete its observable sequence (`asObservable`). -public final class Variable { - - public typealias E = Element - - private let _subject: BehaviorSubject - - private var _lock = SpinLock() - - // state - private var _value: E - - #if DEBUG - fileprivate let _synchronizationTracker = SynchronizationTracker() - #endif - - /// Gets or sets current value of variable. - /// - /// Whenever a new value is set, all the observers are notified of the change. - /// - /// Even if the newly set value is same as the old value, observers are still notified for change. - public var value: E { - get { - _lock.lock(); defer { _lock.unlock() } - return _value - } - set(newValue) { - #if DEBUG - _synchronizationTracker.register(synchronizationErrorMessage: .variable) - defer { _synchronizationTracker.unregister() } - #endif - _lock.lock() - _value = newValue - _lock.unlock() - - _subject.on(.next(newValue)) - } - } - - /// Initializes variable with initial value. - /// - /// - parameter value: Initial variable value. - public init(_ value: Element) { - _value = value - _subject = BehaviorSubject(value: value) - } - - /// - returns: Canonical interface for push style sequence - public func asObservable() -> Observable { - return _subject - } - - deinit { - _subject.on(.completed) - } -} diff --git a/Pods/RxSwift/RxSwift/SwiftSupport/SwiftSupport.swift b/Pods/RxSwift/RxSwift/SwiftSupport/SwiftSupport.swift new file mode 100644 index 00000000..e2a94e3b --- /dev/null +++ b/Pods/RxSwift/RxSwift/SwiftSupport/SwiftSupport.swift @@ -0,0 +1,29 @@ +// +// SwiftSupport.swift +// RxSwift +// +// Created by Volodymyr Gorbenko on 3/6/17. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +import Foundation + +#if swift(>=4.0) + typealias IntMax = Int64 + public typealias RxAbstractInteger = FixedWidthInteger + + extension SignedInteger { + func toIntMax() -> IntMax { + return IntMax(self) + } + } +#else + public typealias RxAbstractInteger = SignedInteger + + extension Array { + public mutating func swapAt(_ i: Int, _ j: Int) { + swap(&self[i], &self[j]) + } + } + +#endif diff --git a/Pods/RxSwift/RxSwift/Traits/Completable.swift b/Pods/RxSwift/RxSwift/Traits/Completable.swift new file mode 100644 index 00000000..8431fed1 --- /dev/null +++ b/Pods/RxSwift/RxSwift/Traits/Completable.swift @@ -0,0 +1,259 @@ +// +// Completable.swift +// RxSwift +// +// Created by sergdort on 19/08/2017. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +#if DEBUG +import Foundation +#endif + +/// Sequence containing 0 elements +public enum CompletableTrait { } +/// Represents a push style sequence containing 0 elements. +public typealias Completable = PrimitiveSequence + +public enum CompletableEvent { + /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`) + case error(Swift.Error) + + /// Sequence completed successfully. + case completed +} + +public extension PrimitiveSequenceType where TraitType == CompletableTrait, ElementType == Swift.Never { + public typealias CompletableObserver = (CompletableEvent) -> () + + /** + Creates an observable sequence from a specified subscribe method implementation. + + - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html) + + - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method. + - returns: The observable sequence with the specified implementation for the `subscribe` method. + */ + public static func create(subscribe: @escaping (@escaping CompletableObserver) -> Disposable) -> PrimitiveSequence { + let source = Observable.create { observer in + return subscribe { event in + switch event { + case .error(let error): + observer.on(.error(error)) + case .completed: + observer.on(.completed) + } + } + } + + return PrimitiveSequence(raw: source) + } + + /** + Subscribes `observer` to receive events for this sequence. + + - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources. + */ + public func subscribe(_ observer: @escaping (CompletableEvent) -> ()) -> Disposable { + var stopped = false + return self.primitiveSequence.asObservable().subscribe { event in + if stopped { return } + stopped = true + + switch event { + case .next: + rxFatalError("Completables can't emit values") + case .error(let error): + observer(.error(error)) + case .completed: + observer(.completed) + } + } + } + + /** + Subscribes a completion handler and an error handler for this sequence. + + - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. + - parameter onError: Action to invoke upon errored termination of the observable sequence. + - returns: Subscription object used to unsubscribe from the observable sequence. + */ + public func subscribe(onCompleted: (() -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil) -> Disposable { + #if DEBUG + let callStack = Hooks.recordCallStackOnError ? Thread.callStackSymbols : [] + #else + let callStack = [String]() + #endif + + return self.primitiveSequence.subscribe { event in + switch event { + case .error(let error): + if let onError = onError { + onError(error) + } else { + Hooks.defaultErrorHandler(callStack, error) + } + case .completed: + onCompleted?() + } + } + } +} + +public extension PrimitiveSequenceType where TraitType == CompletableTrait, ElementType == Swift.Never { + /** + Returns an observable sequence that terminates with an `error`. + + - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html) + + - returns: The observable sequence that terminates with specified error. + */ + public static func error(_ error: Swift.Error) -> Completable { + return PrimitiveSequence(raw: Observable.error(error)) + } + + /** + Returns a non-terminating observable sequence, which can be used to denote an infinite duration. + + - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html) + + - returns: An observable sequence whose observers will never get called. + */ + public static func never() -> Completable { + return PrimitiveSequence(raw: Observable.never()) + } + + /** + Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message. + + - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html) + + - returns: An observable sequence with no elements. + */ + public static func empty() -> Completable { + return Completable(raw: Observable.empty()) + } + +} + +public extension PrimitiveSequenceType where TraitType == CompletableTrait, ElementType == Swift.Never { + /** + Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence. + + - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html) + + - parameter onNext: Action to invoke for each element in the observable sequence. + - parameter onError: Action to invoke upon errored termination of the observable sequence. + - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. + - parameter onSubscribe: Action to invoke before subscribing to source observable sequence. + - parameter onSubscribed: Action to invoke after subscribing to source observable sequence. + - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed. + - returns: The source sequence with the side-effecting behavior applied. + */ + public func `do`(onError: ((Swift.Error) throws -> Void)? = nil, + onCompleted: (() throws -> Void)? = nil, + onSubscribe: (() -> ())? = nil, + onSubscribed: (() -> ())? = nil, + onDispose: (() -> ())? = nil) + -> Completable { + return Completable(raw: primitiveSequence.source.do( + onError: onError, + onCompleted: onCompleted, + onSubscribe: onSubscribe, + onSubscribed: onSubscribed, + onDispose: onDispose) + ) + } + + + + /** + Concatenates the second observable sequence to `self` upon successful termination of `self`. + + - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html) + + - parameter second: Second observable sequence. + - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence. + */ + public func concat(_ second: Completable) -> Completable { + return Completable.concat(primitiveSequence, second) + } + + /** + Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. + + - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html) + + - returns: An observable sequence that contains the elements of each given sequence, in sequential order. + */ + public static func concat(_ sequence: S) -> Completable + where S.Iterator.Element == Completable { + let source = Observable.concat(sequence.lazy.map { $0.asObservable() }) + return Completable(raw: source) + } + + /** + Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. + + - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html) + + - returns: An observable sequence that contains the elements of each given sequence, in sequential order. + */ + public static func concat(_ collection: C) -> Completable + where C.Iterator.Element == Completable { + let source = Observable.concat(collection.map { $0.asObservable() }) + return Completable(raw: source) + } + + /** + Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. + + - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html) + + - returns: An observable sequence that contains the elements of each given sequence, in sequential order. + */ + public static func concat(_ sources: Completable ...) -> Completable { + let source = Observable.concat(sources.map { $0.asObservable() }) + return Completable(raw: source) + } + + /** + Merges elements from all observable sequences from collection into a single observable sequence. + + - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html) + + - parameter sources: Collection of observable sequences to merge. + - returns: The observable sequence that merges the elements of the observable sequences. + */ + public static func merge(_ sources: C) -> Completable + where C.Iterator.Element == Completable { + let source = Observable.merge(sources.map { $0.asObservable() }) + return Completable(raw: source) + } + + /** + Merges elements from all observable sequences from array into a single observable sequence. + + - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html) + + - parameter sources: Array of observable sequences to merge. + - returns: The observable sequence that merges the elements of the observable sequences. + */ + public static func merge(_ sources: [Completable]) -> Completable { + let source = Observable.merge(sources.map { $0.asObservable() }) + return Completable(raw: source) + } + + /** + Merges elements from all observable sequences into a single observable sequence. + + - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html) + + - parameter sources: Collection of observable sequences to merge. + - returns: The observable sequence that merges the elements of the observable sequences. + */ + public static func merge(_ sources: Completable...) -> Completable { + let source = Observable.merge(sources.map { $0.asObservable() }) + return Completable(raw: source) + } +} diff --git a/Pods/RxSwift/RxSwift/Traits/Maybe.swift b/Pods/RxSwift/RxSwift/Traits/Maybe.swift new file mode 100644 index 00000000..09340a65 --- /dev/null +++ b/Pods/RxSwift/RxSwift/Traits/Maybe.swift @@ -0,0 +1,244 @@ +// +// Maybe.swift +// RxSwift +// +// Created by sergdort on 19/08/2017. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +#if DEBUG +import Foundation +#endif + +/// Sequence containing 0 or 1 elements +public enum MaybeTrait { } +/// Represents a push style sequence containing 0 or 1 element. +public typealias Maybe = PrimitiveSequence + +public enum MaybeEvent { + /// One and only sequence element is produced. (underlying observable sequence emits: `.next(Element)`, `.completed`) + case success(Element) + + /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`) + case error(Swift.Error) + + /// Sequence completed successfully. + case completed +} + +public extension PrimitiveSequenceType where TraitType == MaybeTrait { + public typealias MaybeObserver = (MaybeEvent) -> () + + /** + Creates an observable sequence from a specified subscribe method implementation. + + - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html) + + - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method. + - returns: The observable sequence with the specified implementation for the `subscribe` method. + */ + public static func create(subscribe: @escaping (@escaping MaybeObserver) -> Disposable) -> PrimitiveSequence { + let source = Observable.create { observer in + return subscribe { event in + switch event { + case .success(let element): + observer.on(.next(element)) + observer.on(.completed) + case .error(let error): + observer.on(.error(error)) + case .completed: + observer.on(.completed) + } + } + } + + return PrimitiveSequence(raw: source) + } + + /** + Subscribes `observer` to receive events for this sequence. + + - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources. + */ + public func subscribe(_ observer: @escaping (MaybeEvent) -> ()) -> Disposable { + var stopped = false + return self.primitiveSequence.asObservable().subscribe { event in + if stopped { return } + stopped = true + + switch event { + case .next(let element): + observer(.success(element)) + case .error(let error): + observer(.error(error)) + case .completed: + observer(.completed) + } + } + } + + /** + Subscribes a success handler, an error handler, and a completion handler for this sequence. + + - parameter onSuccess: Action to invoke for each element in the observable sequence. + - parameter onError: Action to invoke upon errored termination of the observable sequence. + - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. + - returns: Subscription object used to unsubscribe from the observable sequence. + */ + public func subscribe(onSuccess: ((ElementType) -> Void)? = nil, + onError: ((Swift.Error) -> Void)? = nil, + onCompleted: (() -> Void)? = nil) -> Disposable { + #if DEBUG + let callStack = Hooks.recordCallStackOnError ? Thread.callStackSymbols : [] + #else + let callStack = [String]() + #endif + + return self.primitiveSequence.subscribe { event in + switch event { + case .success(let element): + onSuccess?(element) + case .error(let error): + if let onError = onError { + onError(error) + } else { + Hooks.defaultErrorHandler(callStack, error) + } + case .completed: + onCompleted?() + } + } + } +} + +public extension PrimitiveSequenceType where TraitType == MaybeTrait { + /** + Returns an observable sequence that contains a single element. + + - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html) + + - parameter element: Single element in the resulting observable sequence. + - returns: An observable sequence containing the single specified element. + */ + public static func just(_ element: ElementType) -> Maybe { + return Maybe(raw: Observable.just(element)) + } + + /** + Returns an observable sequence that contains a single element. + + - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html) + + - parameter element: Single element in the resulting observable sequence. + - parameter: Scheduler to send the single element on. + - returns: An observable sequence containing the single specified element. + */ + public static func just(_ element: ElementType, scheduler: ImmediateSchedulerType) -> Maybe { + return Maybe(raw: Observable.just(element, scheduler: scheduler)) + } + + /** + Returns an observable sequence that terminates with an `error`. + + - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html) + + - returns: The observable sequence that terminates with specified error. + */ + public static func error(_ error: Swift.Error) -> Maybe { + return PrimitiveSequence(raw: Observable.error(error)) + } + + /** + Returns a non-terminating observable sequence, which can be used to denote an infinite duration. + + - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html) + + - returns: An observable sequence whose observers will never get called. + */ + public static func never() -> Maybe { + return PrimitiveSequence(raw: Observable.never()) + } + + /** + Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message. + + - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html) + + - returns: An observable sequence with no elements. + */ + public static func empty() -> Maybe { + return Maybe(raw: Observable.empty()) + } +} + +public extension PrimitiveSequenceType where TraitType == MaybeTrait { + /** + Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence. + + - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html) + + - parameter onNext: Action to invoke for each element in the observable sequence. + - parameter onError: Action to invoke upon errored termination of the observable sequence. + - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. + - parameter onSubscribe: Action to invoke before subscribing to source observable sequence. + - parameter onSubscribed: Action to invoke after subscribing to source observable sequence. + - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed. + - returns: The source sequence with the side-effecting behavior applied. + */ + public func `do`(onNext: ((ElementType) throws -> Void)? = nil, + onError: ((Swift.Error) throws -> Void)? = nil, + onCompleted: (() throws -> Void)? = nil, + onSubscribe: (() -> ())? = nil, + onSubscribed: (() -> ())? = nil, + onDispose: (() -> ())? = nil) + -> Maybe { + return Maybe(raw: primitiveSequence.source.do( + onNext: onNext, + onError: onError, + onCompleted: onCompleted, + onSubscribe: onSubscribe, + onSubscribed: onSubscribed, + onDispose: onDispose) + ) + } + + /** + Filters the elements of an observable sequence based on a predicate. + + - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html) + + - parameter predicate: A function to test each source element for a condition. + - returns: An observable sequence that contains elements from the input sequence that satisfy the condition. + */ + public func filter(_ predicate: @escaping (ElementType) throws -> Bool) + -> Maybe { + return Maybe(raw: primitiveSequence.source.filter(predicate)) + } + + /** + Projects each element of an observable sequence into a new form. + + - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html) + + - parameter transform: A transform function to apply to each source element. + - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source. + + */ + public func map(_ transform: @escaping (ElementType) throws -> R) + -> Maybe { + return Maybe(raw: primitiveSequence.source.map(transform)) + } + + /** + Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + + - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html) + + - parameter selector: A transform function to apply to each element. + - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence. + */ + public func flatMap(_ selector: @escaping (ElementType) throws -> Maybe) + -> Maybe { + return Maybe(raw: primitiveSequence.source.flatMap(selector)) + } +} diff --git a/Pods/RxSwift/RxSwift/Traits/ObservableType+PrimitiveSequence.swift b/Pods/RxSwift/RxSwift/Traits/ObservableType+PrimitiveSequence.swift new file mode 100644 index 00000000..ef0b2cb5 --- /dev/null +++ b/Pods/RxSwift/RxSwift/Traits/ObservableType+PrimitiveSequence.swift @@ -0,0 +1,43 @@ +// +// ObservableType+PrimitiveSequence.swift +// RxSwift +// +// Created by Krunoslav Zaher on 9/17/17. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +extension ObservableType { + /** + The `asSingle` operator throws a `RxError.noElements` or `RxError.moreThanOneElement` + if the source Observable does not emit exactly one element before successfully completing. + + - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html) + + - returns: An observable sequence that emits a single element or throws an exception if more (or none) of them are emitted. + */ + public func asSingle() -> Single { + return PrimitiveSequence(raw: AsSingle(source: self.asObservable())) + } + + /** + The `asMaybe` operator throws a ``RxError.moreThanOneElement` + if the source Observable does not emit at most one element before successfully completing. + + - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html) + + - returns: An observable sequence that emits a single element, completes or throws an exception if more of them are emitted. + */ + public func asMaybe() -> Maybe { + return PrimitiveSequence(raw: AsMaybe(source: self.asObservable())) + } +} + +extension ObservableType where E == Never { + /** + - returns: An observable sequence that completes. + */ + public func asCompletable() + -> Completable { + return PrimitiveSequence(raw: self.asObservable()) + } +} diff --git a/Pods/RxSwift/RxSwift/Traits/PrimitiveSequence+Zip+arity.swift b/Pods/RxSwift/RxSwift/Traits/PrimitiveSequence+Zip+arity.swift index 2ab2d1a7..e50e5765 100644 --- a/Pods/RxSwift/RxSwift/Traits/PrimitiveSequence+Zip+arity.swift +++ b/Pods/RxSwift/RxSwift/Traits/PrimitiveSequence+Zip+arity.swift @@ -11,7 +11,7 @@ // 2 -extension PrimitiveSequenceType { +extension PrimitiveSequenceType where TraitType == SingleTrait { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -29,7 +29,7 @@ extension PrimitiveSequenceType { } } -extension PrimitiveSequenceType where ElementType == Any { +extension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait { /** Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. @@ -45,11 +45,80 @@ extension PrimitiveSequenceType where ElementType == Any { } } +extension PrimitiveSequenceType where TraitType == MaybeTrait { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, resultSelector: @escaping (E1, E2) throws -> ElementType) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), + resultSelector: resultSelector) + ) + } +} + +extension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait { + /** + Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable()) + ) + } +} + + // 3 -extension PrimitiveSequenceType { +extension PrimitiveSequenceType where TraitType == SingleTrait { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, _ source3: PrimitiveSequence, resultSelector: @escaping (E1, E2, E3) throws -> ElementType) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), source3.asObservable(), + resultSelector: resultSelector) + ) + } +} + +extension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait { + /** + Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, _ source3: PrimitiveSequence) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), source3.asObservable()) + ) + } +} + +extension PrimitiveSequenceType where TraitType == MaybeTrait { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -67,7 +136,7 @@ extension PrimitiveSequenceType { } } -extension PrimitiveSequenceType where ElementType == Any { +extension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait { /** Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. @@ -85,9 +154,44 @@ extension PrimitiveSequenceType where ElementType == Any { + // 4 -extension PrimitiveSequenceType { +extension PrimitiveSequenceType where TraitType == SingleTrait { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, _ source3: PrimitiveSequence, _ source4: PrimitiveSequence, resultSelector: @escaping (E1, E2, E3, E4) throws -> ElementType) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), + resultSelector: resultSelector) + ) + } +} + +extension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait { + /** + Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, _ source3: PrimitiveSequence, _ source4: PrimitiveSequence) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable()) + ) + } +} + +extension PrimitiveSequenceType where TraitType == MaybeTrait { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -105,7 +209,7 @@ extension PrimitiveSequenceType { } } -extension PrimitiveSequenceType where ElementType == Any { +extension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait { /** Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. @@ -123,9 +227,10 @@ extension PrimitiveSequenceType where ElementType == Any { + // 5 -extension PrimitiveSequenceType { +extension PrimitiveSequenceType where TraitType == SingleTrait { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -143,7 +248,7 @@ extension PrimitiveSequenceType { } } -extension PrimitiveSequenceType where ElementType == Any { +extension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait { /** Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. @@ -159,11 +264,80 @@ extension PrimitiveSequenceType where ElementType == Any { } } +extension PrimitiveSequenceType where TraitType == MaybeTrait { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, _ source3: PrimitiveSequence, _ source4: PrimitiveSequence, _ source5: PrimitiveSequence, resultSelector: @escaping (E1, E2, E3, E4, E5) throws -> ElementType) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), + resultSelector: resultSelector) + ) + } +} + +extension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait { + /** + Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, _ source3: PrimitiveSequence, _ source4: PrimitiveSequence, _ source5: PrimitiveSequence) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable()) + ) + } +} + + // 6 -extension PrimitiveSequenceType { +extension PrimitiveSequenceType where TraitType == SingleTrait { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, _ source3: PrimitiveSequence, _ source4: PrimitiveSequence, _ source5: PrimitiveSequence, _ source6: PrimitiveSequence, resultSelector: @escaping (E1, E2, E3, E4, E5, E6) throws -> ElementType) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), + resultSelector: resultSelector) + ) + } +} + +extension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait { + /** + Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, _ source3: PrimitiveSequence, _ source4: PrimitiveSequence, _ source5: PrimitiveSequence, _ source6: PrimitiveSequence) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable()) + ) + } +} + +extension PrimitiveSequenceType where TraitType == MaybeTrait { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -181,7 +355,7 @@ extension PrimitiveSequenceType { } } -extension PrimitiveSequenceType where ElementType == Any { +extension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait { /** Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. @@ -199,9 +373,10 @@ extension PrimitiveSequenceType where ElementType == Any { + // 7 -extension PrimitiveSequenceType { +extension PrimitiveSequenceType where TraitType == SingleTrait { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -219,7 +394,7 @@ extension PrimitiveSequenceType { } } -extension PrimitiveSequenceType where ElementType == Any { +extension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait { /** Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. @@ -235,11 +410,46 @@ extension PrimitiveSequenceType where ElementType == Any { } } +extension PrimitiveSequenceType where TraitType == MaybeTrait { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, _ source3: PrimitiveSequence, _ source4: PrimitiveSequence, _ source5: PrimitiveSequence, _ source6: PrimitiveSequence, _ source7: PrimitiveSequence, resultSelector: @escaping (E1, E2, E3, E4, E5, E6, E7) throws -> ElementType) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), + resultSelector: resultSelector) + ) + } +} + +extension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait { + /** + Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, _ source3: PrimitiveSequence, _ source4: PrimitiveSequence, _ source5: PrimitiveSequence, _ source6: PrimitiveSequence, _ source7: PrimitiveSequence) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable()) + ) + } +} + + // 8 -extension PrimitiveSequenceType { +extension PrimitiveSequenceType where TraitType == SingleTrait { /** Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. @@ -257,7 +467,7 @@ extension PrimitiveSequenceType { } } -extension PrimitiveSequenceType where ElementType == Any { +extension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait { /** Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. @@ -273,4 +483,39 @@ extension PrimitiveSequenceType where ElementType == Any { } } +extension PrimitiveSequenceType where TraitType == MaybeTrait { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, _ source3: PrimitiveSequence, _ source4: PrimitiveSequence, _ source5: PrimitiveSequence, _ source6: PrimitiveSequence, _ source7: PrimitiveSequence, _ source8: PrimitiveSequence, resultSelector: @escaping (E1, E2, E3, E4, E5, E6, E7, E8) throws -> ElementType) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), source8.asObservable(), + resultSelector: resultSelector) + ) + } +} + +extension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait { + /** + Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index. + + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ source1: PrimitiveSequence, _ source2: PrimitiveSequence, _ source3: PrimitiveSequence, _ source4: PrimitiveSequence, _ source5: PrimitiveSequence, _ source6: PrimitiveSequence, _ source7: PrimitiveSequence, _ source8: PrimitiveSequence) + -> PrimitiveSequence { + return PrimitiveSequence(raw: Observable.zip( + source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), source8.asObservable()) + ) + } +} + + diff --git a/Pods/RxSwift/RxSwift/Traits/PrimitiveSequence.swift b/Pods/RxSwift/RxSwift/Traits/PrimitiveSequence.swift index 3261e420..41ab5d10 100644 --- a/Pods/RxSwift/RxSwift/Traits/PrimitiveSequence.swift +++ b/Pods/RxSwift/RxSwift/Traits/PrimitiveSequence.swift @@ -8,28 +8,13 @@ /// Observable sequences containing 0 or 1 element. public struct PrimitiveSequence { - fileprivate let source: Observable + let source: Observable init(raw: Observable) { self.source = raw } } -/// Sequence containing exactly 1 element -public enum SingleTrait { } -/// Represents a push style sequence containing 1 element. -public typealias Single = PrimitiveSequence - -/// Sequence containing 0 or 1 elements -public enum MaybeTrait { } -/// Represents a push style sequence containing 0 or 1 element. -public typealias Maybe = PrimitiveSequence - -/// Sequence containing 0 elements -public enum CompletableTrait { } -/// Represents a push style sequence containing 0 elements. -public typealias Completable = PrimitiveSequence - /// Observable sequences containing 0 or 1 element public protocol PrimitiveSequenceType { /// Additional constraints @@ -69,254 +54,6 @@ extension PrimitiveSequence: ObservableConvertibleType { } } -// - -public enum SingleEvent { - /// One and only sequence element is produced. (underlying observable sequence emits: `.next(Element)`, `.completed`) - case success(Element) - - /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`) - case error(Swift.Error) -} - -extension PrimitiveSequenceType where TraitType == SingleTrait { - public typealias SingleObserver = (SingleEvent) -> () - - /** - Creates an observable sequence from a specified subscribe method implementation. - - - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html) - - - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method. - - returns: The observable sequence with the specified implementation for the `subscribe` method. - */ - public static func create(subscribe: @escaping (@escaping SingleObserver) -> Disposable) -> PrimitiveSequence { - let source = Observable.create { observer in - return subscribe { event in - switch event { - case .success(let element): - observer.on(.next(element)) - observer.on(.completed) - case .error(let error): - observer.on(.error(error)) - } - } - } - - return PrimitiveSequence(raw: source) - } - - - /** - Subscribes `observer` to receive events for this sequence. - - - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources. - */ - public func subscribe(_ observer: @escaping (SingleEvent) -> ()) -> Disposable { - var stopped = false - return self.primitiveSequence.asObservable().subscribe { event in - if stopped { return } - stopped = true - - switch event { - case .next(let element): - observer(.success(element)) - case .error(let error): - observer(.error(error)) - case .completed: - rxFatalErrorInDebug("Singles can't emit a completion event") - } - } - } - - /** - Subscribes a success handler, and an error handler for this sequence. - - - parameter onSuccess: Action to invoke for each element in the observable sequence. - - parameter onError: Action to invoke upon errored termination of the observable sequence. - - returns: Subscription object used to unsubscribe from the observable sequence. - */ - public func subscribe(onSuccess: ((ElementType) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil) -> Disposable { - return self.primitiveSequence.subscribe { event in - switch event { - case .success(let element): - onSuccess?(element) - case .error(let error): - onError?(error) - } - } - } -} - -// - -// - -public enum MaybeEvent { - /// One and only sequence element is produced. (underlying observable sequence emits: `.next(Element)`, `.completed`) - case success(Element) - - /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`) - case error(Swift.Error) - - /// Sequence completed successfully. - case completed -} - -public extension PrimitiveSequenceType where TraitType == MaybeTrait { - public typealias MaybeObserver = (MaybeEvent) -> () - - /** - Creates an observable sequence from a specified subscribe method implementation. - - - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html) - - - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method. - - returns: The observable sequence with the specified implementation for the `subscribe` method. - */ - public static func create(subscribe: @escaping (@escaping MaybeObserver) -> Disposable) -> PrimitiveSequence { - let source = Observable.create { observer in - return subscribe { event in - switch event { - case .success(let element): - observer.on(.next(element)) - observer.on(.completed) - case .error(let error): - observer.on(.error(error)) - case .completed: - observer.on(.completed) - } - } - } - - return PrimitiveSequence(raw: source) - } - - /** - Subscribes `observer` to receive events for this sequence. - - - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources. - */ - public func subscribe(_ observer: @escaping (MaybeEvent) -> ()) -> Disposable { - var stopped = false - return self.primitiveSequence.asObservable().subscribe { event in - if stopped { return } - stopped = true - - switch event { - case .next(let element): - observer(.success(element)) - case .error(let error): - observer(.error(error)) - case .completed: - observer(.completed) - } - } - } - - /** - Subscribes a success handler, an error handler, and a completion handler for this sequence. - - - parameter onSuccess: Action to invoke for each element in the observable sequence. - - parameter onError: Action to invoke upon errored termination of the observable sequence. - - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - - returns: Subscription object used to unsubscribe from the observable sequence. - */ - public func subscribe(onSuccess: ((ElementType) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil) -> Disposable { - return self.primitiveSequence.subscribe { event in - switch event { - case .success(let element): - onSuccess?(element) - case .error(let error): - onError?(error) - case .completed: - onCompleted?() - } - } - } -} - -// - -// - -public enum CompletableEvent { - /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`) - case error(Swift.Error) - - /// Sequence completed successfully. - case completed -} - -public extension PrimitiveSequenceType where TraitType == CompletableTrait, ElementType == Swift.Never { - public typealias CompletableObserver = (CompletableEvent) -> () - - /** - Creates an observable sequence from a specified subscribe method implementation. - - - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html) - - - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method. - - returns: The observable sequence with the specified implementation for the `subscribe` method. - */ - public static func create(subscribe: @escaping (@escaping CompletableObserver) -> Disposable) -> PrimitiveSequence { - let source = Observable.create { observer in - return subscribe { event in - switch event { - case .error(let error): - observer.on(.error(error)) - case .completed: - observer.on(.completed) - } - } - } - - return PrimitiveSequence(raw: source) - } - - /** - Subscribes `observer` to receive events for this sequence. - - - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources. - */ - public func subscribe(_ observer: @escaping (CompletableEvent) -> ()) -> Disposable { - var stopped = false - return self.primitiveSequence.asObservable().subscribe { event in - if stopped { return } - stopped = true - - switch event { - case .next: - rxFatalError("Completables can't emit values") - case .error(let error): - observer(.error(error)) - case .completed: - observer(.completed) - } - } - } - - /** - Subscribes a completion handler and an error handler for this sequence. - - - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - - parameter onError: Action to invoke upon errored termination of the observable sequence. - - returns: Subscription object used to unsubscribe from the observable sequence. - */ - public func subscribe(onCompleted: (() -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil) -> Disposable { - return self.primitiveSequence.subscribe { event in - switch event { - case .error(let error): - onError?(error) - case .completed: - onCompleted?() - } - } - } -} - -// - extension PrimitiveSequence { /** Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes. @@ -333,68 +70,6 @@ extension PrimitiveSequence { }) } - /** - Returns an observable sequence that contains a single element. - - - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html) - - - parameter element: Single element in the resulting observable sequence. - - returns: An observable sequence containing the single specified element. - */ - public static func just(_ element: Element) -> PrimitiveSequence { - return PrimitiveSequence(raw: Observable.just(element)) - } - - /** - Returns an observable sequence that contains a single element. - - - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html) - - - parameter element: Single element in the resulting observable sequence. - - parameter: Scheduler to send the single element on. - - returns: An observable sequence containing the single specified element. - */ - public static func just(_ element: Element, scheduler: ImmediateSchedulerType) -> PrimitiveSequence { - return PrimitiveSequence(raw: Observable.just(element, scheduler: scheduler)) - } - - /** - Returns an observable sequence that terminates with an `error`. - - - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html) - - - returns: The observable sequence that terminates with specified error. - */ - public static func error(_ error: Swift.Error) -> PrimitiveSequence { - return PrimitiveSequence(raw: Observable.error(error)) - } - - - /** - Returns a non-terminating observable sequence, which can be used to denote an infinite duration. - - - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html) - - - returns: An observable sequence whose observers will never get called. - */ - public static func never() -> PrimitiveSequence { - return PrimitiveSequence(raw: Observable.never()) - } - - /** - Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers. - - - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html) - - - parameter dueTime: Relative time shift of the subscription. - - parameter scheduler: Scheduler to run the subscription delay timer on. - - returns: Time-shifted sequence. - */ - public func delaySubscription(_ dueTime: RxTimeInterval, scheduler: SchedulerType) - -> PrimitiveSequence { - return PrimitiveSequence(raw: source.delaySubscription(dueTime, scheduler: scheduler)) - } - /** Returns an observable sequence by the source observable sequence shifted forward in time by a specified delay. Error events from the source observable sequence are not delayed. @@ -406,74 +81,23 @@ extension PrimitiveSequence { */ public func delay(_ dueTime: RxTimeInterval, scheduler: SchedulerType) -> PrimitiveSequence { - return PrimitiveSequence(raw: source.delay(dueTime, scheduler: scheduler)) + return PrimitiveSequence(raw: primitiveSequence.source.delay(dueTime, scheduler: scheduler)) } /** - Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence. + Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers. - - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html) + - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html) - - parameter onNext: Action to invoke for each element in the observable sequence. - - parameter onError: Action to invoke upon errored termination of the observable sequence. - - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - - parameter onSubscribe: Action to invoke before subscribing to source observable sequence. - - parameter onSubscribed: Action to invoke after subscribing to source observable sequence. - - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed. - - returns: The source sequence with the side-effecting behavior applied. + - parameter dueTime: Relative time shift of the subscription. + - parameter scheduler: Scheduler to run the subscription delay timer on. + - returns: Time-shifted sequence. */ - public func `do`(onNext: ((E) throws -> Void)? = nil, onError: ((Swift.Error) throws -> Void)? = nil, onCompleted: (() throws -> Void)? = nil, onSubscribe: (() -> ())? = nil, onSubscribed: (() -> ())? = nil, onDispose: (() -> ())? = nil) + public func delaySubscription(_ dueTime: RxTimeInterval, scheduler: SchedulerType) -> PrimitiveSequence { - return PrimitiveSequence(raw: source.do( - onNext: onNext, - onError: onError, - onCompleted: onCompleted, - onSubscribe: onSubscribe, - onSubscribed: onSubscribed, - onDispose: onDispose) - ) - } - - /** - Filters the elements of an observable sequence based on a predicate. - - - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html) - - - parameter predicate: A function to test each source element for a condition. - - returns: An observable sequence that contains elements from the input sequence that satisfy the condition. - */ - public func filter(_ predicate: @escaping (E) throws -> Bool) - -> Maybe { - return Maybe(raw: source.filter(predicate)) - } - - /** - Projects each element of an observable sequence into a new form. - - - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html) - - - parameter transform: A transform function to apply to each source element. - - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source. - - */ - public func map(_ transform: @escaping (E) throws -> R) - -> PrimitiveSequence { - return PrimitiveSequence(raw: source.map(transform)) - } - - /** - Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. - - - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html) - - - parameter selector: A transform function to apply to each element. - - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence. - */ - public func flatMap(_ selector: @escaping (ElementType) throws -> PrimitiveSequence) - -> PrimitiveSequence { - return PrimitiveSequence(raw: source.flatMap(selector)) + return PrimitiveSequence(raw: source.delaySubscription(dueTime, scheduler: scheduler)) } - + /** Wraps the source sequence in order to run its observer callbacks on the specified scheduler. @@ -598,35 +222,36 @@ extension PrimitiveSequence { /** Applies a timeout policy for each element in the observable sequence. If the next element isn't received within the specified timeout duration starting from its predecessor, a TimeoutError is propagated to the observer. - + - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html) - + - parameter dueTime: Maximum duration between values before a timeout occurs. - parameter scheduler: Scheduler to run the timeout timer on. - returns: An observable sequence with a `RxError.timeout` in case of a timeout. */ public func timeout(_ dueTime: RxTimeInterval, scheduler: SchedulerType) - -> PrimitiveSequence { - return PrimitiveSequence(raw: source.timeout(dueTime, scheduler: scheduler)) + -> PrimitiveSequence { + return PrimitiveSequence(raw: primitiveSequence.source.timeout(dueTime, scheduler: scheduler)) } - + /** Applies a timeout policy for each element in the observable sequence, using the specified scheduler to run timeout timers. If the next element isn't received within the specified timeout duration starting from its predecessor, the other observable sequence is used to produce future messages from that point on. - + - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html) - + - parameter dueTime: Maximum duration between values before a timeout occurs. - parameter other: Sequence to return in case of a timeout. - parameter scheduler: Scheduler to run the timeout timer on. - returns: The source sequence switching to the other sequence in case of a timeout. */ - public func timeout(_ dueTime: RxTimeInterval, other: PrimitiveSequence, scheduler: SchedulerType) - -> PrimitiveSequence { - return PrimitiveSequence(raw: source.timeout(dueTime, other: other.source, scheduler: scheduler)) + public func timeout(_ dueTime: RxTimeInterval, + other: PrimitiveSequence, + scheduler: SchedulerType) -> PrimitiveSequence { + return PrimitiveSequence(raw: primitiveSequence.source.timeout(dueTime, other: other.source, scheduler: scheduler)) } } -extension PrimitiveSequenceType where ElementType: SignedInteger +extension PrimitiveSequenceType where ElementType: RxAbstractInteger { /** Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers. @@ -642,155 +267,3 @@ extension PrimitiveSequenceType where ElementType: SignedInteger return PrimitiveSequence(raw: Observable.timer(dueTime, scheduler: scheduler)) } } - -extension PrimitiveSequenceType where TraitType == MaybeTrait { - /** - Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message. - - - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html) - - - returns: An observable sequence with no elements. - */ - public static func empty() -> PrimitiveSequence { - return PrimitiveSequence(raw: Observable.empty()) - } -} - -extension PrimitiveSequenceType where TraitType == CompletableTrait, ElementType == Never { - /** - Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message. - - - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html) - - - returns: An observable sequence with no elements. - */ - public static func empty() -> PrimitiveSequence { - return PrimitiveSequence(raw: Observable.empty()) - } - - /** - Concatenates the second observable sequence to `self` upon successful termination of `self`. - - - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html) - - - parameter second: Second observable sequence. - - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence. - */ - public func concat(_ second: PrimitiveSequence) -> PrimitiveSequence { - return Completable.concat(primitiveSequence, second) - } - - /** - Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. - - - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html) - - - returns: An observable sequence that contains the elements of each given sequence, in sequential order. - */ - public static func concat(_ sequence: S) -> PrimitiveSequence - where S.Iterator.Element == PrimitiveSequence { - let source = Observable.concat(sequence.lazy.map { $0.asObservable() }) - return PrimitiveSequence(raw: source) - } - - /** - Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. - - - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html) - - - returns: An observable sequence that contains the elements of each given sequence, in sequential order. - */ - public static func concat(_ collection: C) -> PrimitiveSequence - where C.Iterator.Element == PrimitiveSequence { - let source = Observable.concat(collection.map { $0.asObservable() }) - return PrimitiveSequence(raw: source) - } - - /** - Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. - - - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html) - - - returns: An observable sequence that contains the elements of each given sequence, in sequential order. - */ - public static func concat(_ sources: PrimitiveSequence ...) -> PrimitiveSequence { - let source = Observable.concat(sources.map { $0.asObservable() }) - return PrimitiveSequence(raw: source) - } - - /** - Merges elements from all observable sequences from collection into a single observable sequence. - - - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html) - - - parameter sources: Collection of observable sequences to merge. - - returns: The observable sequence that merges the elements of the observable sequences. - */ - public static func merge(_ sources: C) -> PrimitiveSequence - where C.Iterator.Element == PrimitiveSequence { - let source = Observable.merge(sources.map { $0.asObservable() }) - return PrimitiveSequence(raw: source) - } - - /** - Merges elements from all observable sequences from array into a single observable sequence. - - - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html) - - - parameter sources: Array of observable sequences to merge. - - returns: The observable sequence that merges the elements of the observable sequences. - */ - public static func merge(_ sources: [PrimitiveSequence]) -> PrimitiveSequence { - let source = Observable.merge(sources.map { $0.asObservable() }) - return PrimitiveSequence(raw: source) - } - - /** - Merges elements from all observable sequences into a single observable sequence. - - - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html) - - - parameter sources: Collection of observable sequences to merge. - - returns: The observable sequence that merges the elements of the observable sequences. - */ - public static func merge(_ sources: PrimitiveSequence...) -> PrimitiveSequence { - let source = Observable.merge(sources.map { $0.asObservable() }) - return PrimitiveSequence(raw: source) - } -} - -extension ObservableType { - /** - The `asSingle` operator throws a `RxError.noElements` or `RxError.moreThanOneElement` - if the source Observable does not emit exactly one element before successfully completing. - - - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html) - - - returns: An observable sequence that emits a single element or throws an exception if more (or none) of them are emitted. - */ - public func asSingle() -> Single { - return PrimitiveSequence(raw: AsSingle(source: self.asObservable())) - } - - /** - The `asMaybe` operator throws a ``RxError.moreThanOneElement` - if the source Observable does not emit at most one element before successfully completing. - - - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html) - - - returns: An observable sequence that emits a single element, completes or throws an exception if more of them are emitted. - */ - public func asMaybe() -> Maybe { - return PrimitiveSequence(raw: AsMaybe(source: self.asObservable())) - } -} - -extension ObservableType where E == Never { - /** - - returns: An observable sequence that completes. - */ - public func asCompletable() - -> Completable { - return PrimitiveSequence(raw: self.asObservable()) - } -} diff --git a/Pods/RxSwift/RxSwift/Traits/Single.swift b/Pods/RxSwift/RxSwift/Traits/Single.swift new file mode 100644 index 00000000..423cf694 --- /dev/null +++ b/Pods/RxSwift/RxSwift/Traits/Single.swift @@ -0,0 +1,251 @@ +// +// Single.swift +// RxSwift +// +// Created by sergdort on 19/08/2017. +// Copyright © 2017 Krunoslav Zaher. All rights reserved. +// + +#if DEBUG +import Foundation +#endif + +/// Sequence containing exactly 1 element +public enum SingleTrait { } +/// Represents a push style sequence containing 1 element. +public typealias Single = PrimitiveSequence + +public enum SingleEvent { + /// One and only sequence element is produced. (underlying observable sequence emits: `.next(Element)`, `.completed`) + case success(Element) + + /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`) + case error(Swift.Error) +} + +extension PrimitiveSequenceType where TraitType == SingleTrait { + public typealias SingleObserver = (SingleEvent) -> () + + /** + Creates an observable sequence from a specified subscribe method implementation. + + - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html) + + - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method. + - returns: The observable sequence with the specified implementation for the `subscribe` method. + */ + public static func create(subscribe: @escaping (@escaping SingleObserver) -> Disposable) -> Single { + let source = Observable.create { observer in + return subscribe { event in + switch event { + case .success(let element): + observer.on(.next(element)) + observer.on(.completed) + case .error(let error): + observer.on(.error(error)) + } + } + } + + return PrimitiveSequence(raw: source) + } + + + /** + Subscribes `observer` to receive events for this sequence. + + - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources. + */ + public func subscribe(_ observer: @escaping (SingleEvent) -> ()) -> Disposable { + var stopped = false + return self.primitiveSequence.asObservable().subscribe { event in + if stopped { return } + stopped = true + + switch event { + case .next(let element): + observer(.success(element)) + case .error(let error): + observer(.error(error)) + case .completed: + rxFatalErrorInDebug("Singles can't emit a completion event") + } + } + } + + /** + Subscribes a success handler, and an error handler for this sequence. + + - parameter onSuccess: Action to invoke for each element in the observable sequence. + - parameter onError: Action to invoke upon errored termination of the observable sequence. + - returns: Subscription object used to unsubscribe from the observable sequence. + */ + public func subscribe(onSuccess: ((ElementType) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil) -> Disposable { + #if DEBUG + let callStack = Hooks.recordCallStackOnError ? Thread.callStackSymbols : [] + #else + let callStack = [String]() + #endif + + return self.primitiveSequence.subscribe { event in + switch event { + case .success(let element): + onSuccess?(element) + case .error(let error): + if let onError = onError { + onError(error) + } else { + Hooks.defaultErrorHandler(callStack, error) + } + } + } + } +} + +extension PrimitiveSequenceType where TraitType == SingleTrait { + /** + Returns an observable sequence that contains a single element. + + - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html) + + - parameter element: Single element in the resulting observable sequence. + - returns: An observable sequence containing the single specified element. + */ + public static func just(_ element: ElementType) -> Single { + return Single(raw: Observable.just(element)) + } + + /** + Returns an observable sequence that contains a single element. + + - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html) + + - parameter element: Single element in the resulting observable sequence. + - parameter: Scheduler to send the single element on. + - returns: An observable sequence containing the single specified element. + */ + public static func just(_ element: ElementType, scheduler: ImmediateSchedulerType) -> Single { + return Single(raw: Observable.just(element, scheduler: scheduler)) + } + + /** + Returns an observable sequence that terminates with an `error`. + + - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html) + + - returns: The observable sequence that terminates with specified error. + */ + public static func error(_ error: Swift.Error) -> Single { + return PrimitiveSequence(raw: Observable.error(error)) + } + + /** + Returns a non-terminating observable sequence, which can be used to denote an infinite duration. + + - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html) + + - returns: An observable sequence whose observers will never get called. + */ + public static func never() -> Single { + return PrimitiveSequence(raw: Observable.never()) + } +} + +extension PrimitiveSequenceType where TraitType == SingleTrait { + + /** + Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence. + + - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html) + + - parameter onSuccess: Action to invoke for each element in the observable sequence. + - parameter onError: Action to invoke upon errored termination of the observable sequence. + - parameter onSubscribe: Action to invoke before subscribing to source observable sequence. + - parameter onSubscribed: Action to invoke after subscribing to source observable sequence. + - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed. + - returns: The source sequence with the side-effecting behavior applied. + */ + public func `do`(onSuccess: ((ElementType) throws -> Void)? = nil, + onError: ((Swift.Error) throws -> Void)? = nil, + onSubscribe: (() -> ())? = nil, + onSubscribed: (() -> ())? = nil, + onDispose: (() -> ())? = nil) + -> Single { + return Single(raw: primitiveSequence.source.do( + onNext: onSuccess, + onError: onError, + onSubscribe: onSubscribe, + onSubscribed: onSubscribed, + onDispose: onDispose) + ) + } + + /** + Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence. + + - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html) + + - parameter onNext: Action to invoke for each element in the observable sequence. + - parameter onError: Action to invoke upon errored termination of the observable sequence. + - parameter onSubscribe: Action to invoke before subscribing to source observable sequence. + - parameter onSubscribed: Action to invoke after subscribing to source observable sequence. + - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed. + - returns: The source sequence with the side-effecting behavior applied. + */ + @available(*, deprecated, message: "Use do(onSuccess:onError:onSubscribe:onSubcribed:onDispose:) instead", renamed: "do(onSuccess:onError:onSubscribe:onSubcribed:onDispose:)") + public func `do`(onNext: ((ElementType) throws -> Void)?, + onError: ((Swift.Error) throws -> Void)? = nil, + onSubscribe: (() -> ())? = nil, + onSubscribed: (() -> ())? = nil, + onDispose: (() -> ())? = nil) + -> Single { + return `do`( + onSuccess: onNext, + onError: onError, + onSubscribe: onSubscribe, + onSubscribed: onSubscribed, + onDispose: onDispose + ) + } + + /** + Filters the elements of an observable sequence based on a predicate. + + - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html) + + - parameter predicate: A function to test each source element for a condition. + - returns: An observable sequence that contains elements from the input sequence that satisfy the condition. + */ + public func filter(_ predicate: @escaping (ElementType) throws -> Bool) + -> Maybe { + return Maybe(raw: primitiveSequence.source.filter(predicate)) + } + + + /** + Projects each element of an observable sequence into a new form. + + - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html) + + - parameter transform: A transform function to apply to each source element. + - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source. + + */ + public func map(_ transform: @escaping (ElementType) throws -> R) + -> Single { + return Single(raw: primitiveSequence.source.map(transform)) + } + + /** + Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. + + - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html) + + - parameter selector: A transform function to apply to each element. + - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence. + */ + public func flatMap(_ selector: @escaping (ElementType) throws -> Single) + -> Single { + return Single(raw: primitiveSequence.source.flatMap(selector)) + } +} diff --git a/Pods/Target Support Files/Alamofire/Alamofire.xcconfig b/Pods/Target Support Files/Alamofire/Alamofire.xcconfig index a7c04cec..dda36c1d 100644 --- a/Pods/Target Support Files/Alamofire/Alamofire.xcconfig +++ b/Pods/Target Support Files/Alamofire/Alamofire.xcconfig @@ -1,10 +1,10 @@ CODE_SIGN_IDENTITY = -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Alamofire +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Alamofire GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/Alamofire PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} diff --git a/Pods/Target Support Files/Alamofire/Info.plist b/Pods/Target Support Files/Alamofire/Info.plist index 6631be71..34125306 100644 --- a/Pods/Target Support Files/Alamofire/Info.plist +++ b/Pods/Target Support Files/Alamofire/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.2.0 + 4.7.2 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/BRLOptionParser/BRLOptionParser.xcconfig b/Pods/Target Support Files/BRLOptionParser/BRLOptionParser.xcconfig index 3784c027..af364a61 100644 --- a/Pods/Target Support Files/BRLOptionParser/BRLOptionParser.xcconfig +++ b/Pods/Target Support Files/BRLOptionParser/BRLOptionParser.xcconfig @@ -1,8 +1,8 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/BRLOptionParser +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/BRLOptionParser GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/BRLOptionParser" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/BRLOptionParser PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} diff --git a/Pods/Target Support Files/GCDWebServer/GCDWebServer.xcconfig b/Pods/Target Support Files/GCDWebServer/GCDWebServer.xcconfig index 7dbb43b2..db185199 100644 --- a/Pods/Target Support Files/GCDWebServer/GCDWebServer.xcconfig +++ b/Pods/Target Support Files/GCDWebServer/GCDWebServer.xcconfig @@ -1,10 +1,10 @@ CODE_SIGN_IDENTITY = -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/GCDWebServer +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" OTHER_LDFLAGS = -l"z" -framework "SystemConfiguration" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/GCDWebServer PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} diff --git a/Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig b/Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig index 67803f44..befd45a9 100644 --- a/Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig +++ b/Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig @@ -1,10 +1,10 @@ CODE_SIGN_IDENTITY = -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/MASShortcut +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" OTHER_LDFLAGS = -framework "AppKit" -framework "Carbon" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/MASShortcut PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-acknowledgements.markdown b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-acknowledgements.markdown index 6bde1ea7..7e8e6482 100644 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-acknowledgements.markdown @@ -3,7 +3,7 @@ This application makes use of the following third party libraries: ## Alamofire -Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +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 diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-acknowledgements.plist b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-acknowledgements.plist index 9f2b39a6..b3634675 100644 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-acknowledgements.plist @@ -14,7 +14,7 @@ FooterText - Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) + 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 diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh index e9c54a56..9cc82aba 100755 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh @@ -6,10 +6,14 @@ mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + # 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 @@ -58,12 +62,31 @@ install_framework() fi } -# Copies the dSYM of a vendored framework +# Copies and strips a vendored dSYM install_dsym() { local source="$1" if [ -r "$source" ]; then - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DWARF_DSYM_FOLDER_PATH}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DWARF_DSYM_FOLDER_PATH}" + # Copy the dSYM into a 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 .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --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[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.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}.framework.dSYM" + fi fi } @@ -85,10 +108,18 @@ code_sign_if_enabled() { # Strip invalid architectures strip_invalid_archs() { binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + # 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 + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi stripped="" - for arch in $archs; do + for arch in $binary_archs; do if ! [[ "${ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place lipo -remove "$arch" -output "$binary" "$binary" || exit 1 @@ -98,6 +129,7 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi + STRIP_BINARY_RETVAL=1 } diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.debug.xcconfig b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.debug.xcconfig index 4dd8f840..6f1f62c3 100644 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.debug.xcconfig +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.debug.xcconfig @@ -1,12 +1,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CODE_SIGN_IDENTITY = -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer" "$PODS_CONFIGURATION_BUILD_DIR/MASShortcut" "$PODS_CONFIGURATION_BUILD_DIR/RxCocoa" "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer" "${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut" "${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa" "${PODS_CONFIGURATION_BUILD_DIR}/RxSwift" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer/GCDWebServer.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/MASShortcut/MASShortcut.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxCocoa/RxCocoa.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer/GCDWebServer.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut/MASShortcut.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa/RxCocoa.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/RxSwift/RxSwift.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "GCDWebServer" -framework "MASShortcut" -framework "RxCocoa" -framework "RxSwift" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +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 diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.release.xcconfig b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.release.xcconfig index 4dd8f840..6f1f62c3 100644 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.release.xcconfig +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.release.xcconfig @@ -1,12 +1,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CODE_SIGN_IDENTITY = -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer" "$PODS_CONFIGURATION_BUILD_DIR/MASShortcut" "$PODS_CONFIGURATION_BUILD_DIR/RxCocoa" "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer" "${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut" "${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa" "${PODS_CONFIGURATION_BUILD_DIR}/RxSwift" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer/GCDWebServer.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/MASShortcut/MASShortcut.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxCocoa/RxCocoa.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer/GCDWebServer.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut/MASShortcut.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa/RxCocoa.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/RxSwift/RxSwift.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "GCDWebServer" -framework "MASShortcut" -framework "RxCocoa" -framework "RxSwift" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +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 diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-frameworks.sh b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-frameworks.sh index 88dd5379..881cbaed 100755 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-frameworks.sh +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-frameworks.sh @@ -6,10 +6,14 @@ mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + # 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 @@ -58,12 +62,31 @@ install_framework() fi } -# Copies the dSYM of a vendored framework +# Copies and strips a vendored dSYM install_dsym() { local source="$1" if [ -r "$source" ]; then - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DWARF_DSYM_FOLDER_PATH}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DWARF_DSYM_FOLDER_PATH}" + # Copy the dSYM into a 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 .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --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[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.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}.framework.dSYM" + fi fi } @@ -85,10 +108,18 @@ code_sign_if_enabled() { # Strip invalid architectures strip_invalid_archs() { binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + # 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 + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi stripped="" - for arch in $archs; do + for arch in $binary_archs; do if ! [[ "${ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place lipo -remove "$arch" -output "$binary" "$binary" || exit 1 @@ -98,6 +129,7 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi + STRIP_BINARY_RETVAL=1 } if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.debug.xcconfig b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.debug.xcconfig index b6369388..e0176828 100644 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.debug.xcconfig @@ -1,9 +1,9 @@ CODE_SIGN_IDENTITY = -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer" "$PODS_CONFIGURATION_BUILD_DIR/MASShortcut" "$PODS_CONFIGURATION_BUILD_DIR/RxCocoa" "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer" "${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut" "${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa" "${PODS_CONFIGURATION_BUILD_DIR}/RxSwift" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/../Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer/GCDWebServer.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/MASShortcut/MASShortcut.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxCocoa/RxCocoa.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer/GCDWebServer.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut/MASShortcut.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa/RxCocoa.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/RxSwift/RxSwift.framework/Headers" +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 diff --git a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.release.xcconfig b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.release.xcconfig index b6369388..e0176828 100644 --- a/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.release.xcconfig +++ b/Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.release.xcconfig @@ -1,9 +1,9 @@ CODE_SIGN_IDENTITY = -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer" "$PODS_CONFIGURATION_BUILD_DIR/MASShortcut" "$PODS_CONFIGURATION_BUILD_DIR/RxCocoa" "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer" "${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut" "${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa" "${PODS_CONFIGURATION_BUILD_DIR}/RxSwift" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/../Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GCDWebServer/GCDWebServer.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/MASShortcut/MASShortcut.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxCocoa/RxCocoa.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer/GCDWebServer.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut/MASShortcut.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa/RxCocoa.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/RxSwift/RxSwift.framework/Headers" +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 diff --git a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-frameworks.sh b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-frameworks.sh index 88dd5379..881cbaed 100755 --- a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-frameworks.sh +++ b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-frameworks.sh @@ -6,10 +6,14 @@ mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + # 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 @@ -58,12 +62,31 @@ install_framework() fi } -# Copies the dSYM of a vendored framework +# Copies and strips a vendored dSYM install_dsym() { local source="$1" if [ -r "$source" ]; then - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DWARF_DSYM_FOLDER_PATH}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DWARF_DSYM_FOLDER_PATH}" + # Copy the dSYM into a 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 .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --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[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.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}.framework.dSYM" + fi fi } @@ -85,10 +108,18 @@ code_sign_if_enabled() { # Strip invalid architectures strip_invalid_archs() { binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + # 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 + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi stripped="" - for arch in $archs; do + for arch in $binary_archs; do if ! [[ "${ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place lipo -remove "$arch" -output "$binary" "$binary" || exit 1 @@ -98,6 +129,7 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi + STRIP_BINARY_RETVAL=1 } if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then diff --git a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.debug.xcconfig b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.debug.xcconfig index 1a54b2ba..2f65c6e0 100644 --- a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.debug.xcconfig +++ b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.debug.xcconfig @@ -1,9 +1,9 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" -LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/BRLOptionParser" +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/BRLOptionParser" OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/BRLOptionParser" OTHER_LDFLAGS = $(inherited) -ObjC -l"BRLOptionParser" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +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 diff --git a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.release.xcconfig b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.release.xcconfig index 1a54b2ba..2f65c6e0 100644 --- a/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.release.xcconfig +++ b/Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.release.xcconfig @@ -1,9 +1,9 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" -LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/BRLOptionParser" +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/BRLOptionParser" OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/BRLOptionParser" OTHER_LDFLAGS = $(inherited) -ObjC -l"BRLOptionParser" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +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 diff --git a/Pods/Target Support Files/RxCocoa/Info.plist b/Pods/Target Support Files/RxCocoa/Info.plist index 646f73ca..7ecb368d 100644 --- a/Pods/Target Support Files/RxCocoa/Info.plist +++ b/Pods/Target Support Files/RxCocoa/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.6.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/RxCocoa/RxCocoa.xcconfig b/Pods/Target Support Files/RxCocoa/RxCocoa.xcconfig index 7996294d..25f353b0 100644 --- a/Pods/Target Support Files/RxCocoa/RxCocoa.xcconfig +++ b/Pods/Target Support Files/RxCocoa/RxCocoa.xcconfig @@ -1,11 +1,11 @@ CODE_SIGN_IDENTITY = -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RxCocoa -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/RxSwift" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/RxCocoa PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} diff --git a/Pods/Target Support Files/RxSwift/Info.plist b/Pods/Target Support Files/RxSwift/Info.plist index 646f73ca..7ecb368d 100644 --- a/Pods/Target Support Files/RxSwift/Info.plist +++ b/Pods/Target Support Files/RxSwift/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.6.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion diff --git a/Pods/Target Support Files/RxSwift/RxSwift.xcconfig b/Pods/Target Support Files/RxSwift/RxSwift.xcconfig index e28d570a..abf03587 100644 --- a/Pods/Target Support Files/RxSwift/RxSwift.xcconfig +++ b/Pods/Target Support Files/RxSwift/RxSwift.xcconfig @@ -1,10 +1,10 @@ CODE_SIGN_IDENTITY = -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RxSwift +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RxSwift GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/BRLOptionParser" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/RxSwift PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} diff --git a/README.md b/README.md index 69eba9cf..c5f1c9fb 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # ShadowsocksX-NG -Current version is 1.7.1 +Current version is 1.8.0 [![Build Status](https://travis-ci.org/shadowsocks/ShadowsocksX-NG.svg?branch=develop)](https://travis-ci.org/shadowsocks/ShadowsocksX-NG) Next Generation of [ShadowsocksX](https://github.com/shadowsocks/shadowsocks-iOS) -## Why? +## Why a new implementation? It's hard to maintain the original implementation as there is too much unused code in it. It also embeds the `ss-local` source. It's crazy to maintain dependencies of `ss-local`. @@ -24,8 +24,8 @@ Then I will rewrite the GUI code in Swift. ### Building -- Xcode 9.2+ -- CocoaPods 1.3.1+ +- Xcode 9.4.1+ +- CocoaPods 1.5.3+ ## Download @@ -33,25 +33,15 @@ From [here](https://github.com/shadowsocks/ShadowsocksX-NG/releases/) ## Features -- Uses `ss-local` from shadowsocks-libev 3.0.5 +- `ss-local` from shadowsocks-libev 3.2.0 +- Support SIP003 plugins. Embed `kcptun` and `simple-obfs`. - Could update PAC by download GFW List from GitHub. -- Shows QRCode for current server profile. -- Scans QRCode from screen. -- Auto launch at login. -- User rules for PAC. +- Share your server profiles by qrcode or url. +- Import server profile urls from pasteboard. +- Import server profile by scan QRCode on screen. +- Custom rules for PAC. - Support for [AEAD Ciphers](https://shadowsocks.org/en/spec/AEAD-Ciphers.html) - HTTP Proxy by [privoxy](http://www.privoxy.org/) -- Over [kcptun](https://github.com/xtaci/kcptun). Version 20170322 -- Export/Import configure file. -- An advanced preferences panel for configuring: - - Local SOCKS5 listen address. - - Local SOCKS5 listen port. - - Local SOCKS5 timeout. - - If enable UDP relay. - - GFW List URL. -- Manually specify network service profiles which would be used to configure the proxy. -- Could reorder shadowsocks profiles by drag-&-dropping in servers preferences panel. -- Configurable global shortcuts for toggle running and switch proxy mode. ## Difference from original ShadowsocksX diff --git a/ShadowsocksX-NG.xcodeproj/project.pbxproj b/ShadowsocksX-NG.xcodeproj/project.pbxproj index fb12ccd0..d3f372cf 100755 --- a/ShadowsocksX-NG.xcodeproj/project.pbxproj +++ b/ShadowsocksX-NG.xcodeproj/project.pbxproj @@ -26,8 +26,6 @@ 9B3546721E802B1200B510B4 /* ToastWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B3546701E802B1200B510B4 /* ToastWindowController.swift */; }; 9B3546731E802B1200B510B4 /* ToastWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B3546711E802B1200B510B4 /* ToastWindowController.xib */; }; 9B3F7BFF1E82BF5B00C68B75 /* libev.4.dylib in Resources */ = {isa = PBXBuildFile; fileRef = 9B3F7BF71E82BF2D00C68B75 /* libev.4.dylib */; }; - 9B3F7C001E82BF5B00C68B75 /* libmbedcrypto.2.4.2.dylib in Resources */ = {isa = PBXBuildFile; fileRef = 9B3F7BF81E82BF2D00C68B75 /* libmbedcrypto.2.4.2.dylib */; }; - 9B3F7C021E82BF5B00C68B75 /* libudns.0.dylib in Resources */ = {isa = PBXBuildFile; fileRef = 9B3F7BFA1E82BF2E00C68B75 /* libudns.0.dylib */; }; 9B3FFF0D1D05FEB30019A709 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF0C1D05FEB30019A709 /* Utils.swift */; }; 9B3FFF141D0705810019A709 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF131D0705810019A709 /* Notifications.swift */; }; 9B3FFF171D072FDE0019A709 /* LaunchAtLoginController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF161D072FDE0019A709 /* LaunchAtLoginController.m */; }; @@ -48,11 +46,11 @@ 9B5832031E741F8D009D5B7D /* command-512.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B5832021E741F8D009D5B7D /* command-512.png */; }; 9B5832071E7421B2009D5B7D /* virtual-server-icon-3.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B5832061E7421B2009D5B7D /* virtual-server-icon-3.png */; }; 9B58320B1E7422DB009D5B7D /* http.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B58320A1E7422DB009D5B7D /* http.png */; }; - 9B5832111E742632009D5B7D /* kcptun_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B5832101E742632009D5B7D /* kcptun_1.png */; }; - 9B5AA0A1209C100C00E8B659 /* libsodium.23.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B5AA09F209C100C00E8B659 /* libsodium.23.dylib */; }; - 9B5AA0A3209C103900E8B659 /* libcares.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B5AA0A2209C103900E8B659 /* libcares.2.dylib */; }; - 9B5AA0A5209C115B00E8B659 /* libmbedcrypto.2.8.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B5AA0A4209C115B00E8B659 /* libmbedcrypto.2.8.0.dylib */; }; + 9B5AA0AC209C43C200E8B659 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 9B5AA0AB209C43C200E8B659 /* Credits.rtf */; }; 9B6BF9541E27B2570061B9A7 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B6BF9531E27B2570061B9A7 /* ServiceManagement.framework */; }; + 9B7297E7214D69C300FD24AA /* libmbedcrypto.2.12.0.dylib in Resources */ = {isa = PBXBuildFile; fileRef = 9B7297E5214D68F800FD24AA /* libmbedcrypto.2.12.0.dylib */; }; + 9B7297EA214D7C6B00FD24AA /* ShareServerProfilesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B7297E8214D7C6B00FD24AA /* ShareServerProfilesWindowController.swift */; }; + 9B7297EC214DA88A00FD24AA /* ShareServerProfilesWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B7297EE214DA88A00FD24AA /* ShareServerProfilesWindowController.xib */; }; 9B86459D1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B86459C1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift */; }; 9B938D991E864B38005F5636 /* menu_g_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B938D931E864B38005F5636 /* menu_g_icon.png */; }; 9B938D9A1E864B38005F5636 /* menu_g_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B938D941E864B38005F5636 /* menu_g_icon@2x.png */; }; @@ -60,18 +58,15 @@ 9B938D9C1E864B38005F5636 /* menu_m_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B938D961E864B38005F5636 /* menu_m_icon@2x.png */; }; 9B938D9D1E864B38005F5636 /* menu_p_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B938D971E864B38005F5636 /* menu_p_icon.png */; }; 9B938D9E1E864B38005F5636 /* menu_p_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B938D981E864B38005F5636 /* menu_p_icon@2x.png */; }; - 9B9CBCA61E25E1DB00FC61AA /* KcptunProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B9CBCA51E25E1DB00FC61AA /* KcptunProfile.swift */; }; - 9B9CBCA81E26312E00FC61AA /* install_kcptun.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9B9CBCA71E26310E00FC61AA /* install_kcptun.sh */; }; - 9B9CBCAA1E2633CB00FC61AA /* kcptun_client in Resources */ = {isa = PBXBuildFile; fileRef = 9B9CBCA91E2633CB00FC61AA /* kcptun_client */; }; 9B9CBCAF1E263B1600FC61AA /* libpcre.1.dylib in Resources */ = {isa = PBXBuildFile; fileRef = 9B9CBCAD1E263A6600FC61AA /* libpcre.1.dylib */; }; - 9B9CBCB41E26453C00FC61AA /* start_kcptun.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9B9CBCB01E2644DC00FC61AA /* start_kcptun.sh */; }; - 9B9CBCB51E26453C00FC61AA /* stop_kcptun.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9B9CBCB11E26450D00FC61AA /* stop_kcptun.sh */; }; 9B9F13A71E8A28B300DE4794 /* LaunchHelper.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9B9F13A61E8A282D00DE4794 /* LaunchHelper.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 9BA04B231D23D5A5005AAD7F /* ProxyConfTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BA04B221D23D5A5005AAD7F /* ProxyConfTool.m */; }; 9BAFE2E21E83ED7F00F71CCE /* PreferencesWinController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9BAFE2E41E83ED7F00F71CCE /* PreferencesWinController.xib */; }; 9BB706A71D1B982300551F0E /* SWBApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BB706A51D1B982300551F0E /* SWBApplication.m */; }; 9BBE7B751F508A0E00E8FFE5 /* fix_dir_owner.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9BBE7B711F50790500E8FFE5 /* fix_dir_owner.sh */; }; 9BC70EDC1D2E3E3100EDA4CA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9B172A6C1D0ADDDD00B87B9A /* Localizable.strings */; }; + 9BCB1D6C20A15B0E005BABE7 /* libsodium.23.dylib in Resources */ = {isa = PBXBuildFile; fileRef = 9B5AA09F209C100C00E8B659 /* libsodium.23.dylib */; }; + 9BCB1D6D20A15B0E005BABE7 /* libcares.2.dylib in Resources */ = {isa = PBXBuildFile; fileRef = 9B5AA0A2209C103900E8B659 /* libcares.2.dylib */; }; 9BEEF0691D04D4D500FC52B3 /* install_ss_local.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9BEEF0651D04CB8500FC52B3 /* install_ss_local.sh */; }; 9BEEF06A1D04D4D500FC52B3 /* start_ss_local.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9BEEF0661D04CE8D00FC52B3 /* start_ss_local.sh */; }; 9BEEF06B1D04D4D500FC52B3 /* stop_ss_local.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9BEEF0671D04CE9A00FC52B3 /* stop_ss_local.sh */; }; @@ -172,8 +167,6 @@ 9B3546701E802B1200B510B4 /* ToastWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToastWindowController.swift; sourceTree = ""; }; 9B3546711E802B1200B510B4 /* ToastWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ToastWindowController.xib; sourceTree = ""; }; 9B3F7BF71E82BF2D00C68B75 /* libev.4.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libev.4.dylib; sourceTree = ""; }; - 9B3F7BF81E82BF2D00C68B75 /* libmbedcrypto.2.4.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libmbedcrypto.2.4.2.dylib; sourceTree = ""; }; - 9B3F7BFA1E82BF2E00C68B75 /* libudns.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libudns.0.dylib; sourceTree = ""; }; 9B3FFF0C1D05FEB30019A709 /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; 9B3FFF131D0705810019A709 /* Notifications.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Notifications.swift; sourceTree = ""; }; 9B3FFF151D072FDE0019A709 /* LaunchAtLoginController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LaunchAtLoginController.h; sourceTree = ""; }; @@ -203,11 +196,14 @@ 9B5832021E741F8D009D5B7D /* command-512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "command-512.png"; sourceTree = ""; }; 9B5832061E7421B2009D5B7D /* virtual-server-icon-3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "virtual-server-icon-3.png"; sourceTree = ""; }; 9B58320A1E7422DB009D5B7D /* http.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = http.png; sourceTree = ""; }; - 9B5832101E742632009D5B7D /* kcptun_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = kcptun_1.png; sourceTree = ""; }; 9B5AA09F209C100C00E8B659 /* libsodium.23.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libsodium.23.dylib; sourceTree = ""; }; 9B5AA0A2209C103900E8B659 /* libcares.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libcares.2.dylib; sourceTree = ""; }; - 9B5AA0A4209C115B00E8B659 /* libmbedcrypto.2.8.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libmbedcrypto.2.8.0.dylib; sourceTree = ""; }; + 9B5AA0AB209C43C200E8B659 /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 9B6BF9531E27B2570061B9A7 /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; }; + 9B7297E5214D68F800FD24AA /* libmbedcrypto.2.12.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libmbedcrypto.2.12.0.dylib; sourceTree = ""; }; + 9B7297E8214D7C6B00FD24AA /* ShareServerProfilesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareServerProfilesWindowController.swift; sourceTree = ""; }; + 9B7297ED214DA88A00FD24AA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ShareServerProfilesWindowController.xib; sourceTree = ""; }; + 9B7297F0214DA89000FD24AA /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/ShareServerProfilesWindowController.strings"; sourceTree = ""; }; 9B86459C1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxyInterfacesViewCtrl.swift; sourceTree = ""; }; 9B938D931E864B38005F5636 /* menu_g_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_g_icon.png; sourceTree = ""; }; 9B938D941E864B38005F5636 /* menu_g_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_g_icon@2x.png"; sourceTree = ""; }; @@ -215,12 +211,7 @@ 9B938D961E864B38005F5636 /* menu_m_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_m_icon@2x.png"; sourceTree = ""; }; 9B938D971E864B38005F5636 /* menu_p_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_p_icon.png; sourceTree = ""; }; 9B938D981E864B38005F5636 /* menu_p_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_p_icon@2x.png"; sourceTree = ""; }; - 9B9CBCA51E25E1DB00FC61AA /* KcptunProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KcptunProfile.swift; sourceTree = ""; }; - 9B9CBCA71E26310E00FC61AA /* install_kcptun.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = install_kcptun.sh; sourceTree = ""; }; - 9B9CBCA91E2633CB00FC61AA /* kcptun_client */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = kcptun_client; sourceTree = ""; }; 9B9CBCAD1E263A6600FC61AA /* libpcre.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libpcre.1.dylib; sourceTree = ""; }; - 9B9CBCB01E2644DC00FC61AA /* start_kcptun.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = start_kcptun.sh; sourceTree = ""; }; - 9B9CBCB11E26450D00FC61AA /* stop_kcptun.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = stop_kcptun.sh; sourceTree = ""; }; 9B9F13A11E8A282C00DE4794 /* LaunchHelper.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = LaunchHelper.xcodeproj; path = LaunchHelper/LaunchHelper.xcodeproj; sourceTree = ""; }; 9BA04B211D23D5A5005AAD7F /* ProxyConfTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProxyConfTool.h; sourceTree = ""; }; 9BA04B221D23D5A5005AAD7F /* ProxyConfTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProxyConfTool.m; sourceTree = ""; }; @@ -257,12 +248,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9B5AA0A3209C103900E8B659 /* libcares.2.dylib in Frameworks */, 9B6BF9541E27B2570061B9A7 /* ServiceManagement.framework in Frameworks */, 9B3FFF3E1D08D9910019A709 /* SystemConfiguration.framework in Frameworks */, - 9B5AA0A5209C115B00E8B659 /* libmbedcrypto.2.8.0.dylib in Frameworks */, 258E511BA910B0521B24DAB8 /* Pods_ShadowsocksX_NG.framework in Frameworks */, - 9B5AA0A1209C100C00E8B659 /* libsodium.23.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -312,11 +300,10 @@ 9B07EFB01D048E900052D9DF /* Support Files */ = { isa = PBXGroup; children = ( - 9B5AA09F209C100C00E8B659 /* libsodium.23.dylib */, - 9B5AA0A2209C103900E8B659 /* libcares.2.dylib */, - 9B5AA0A4209C115B00E8B659 /* libmbedcrypto.2.8.0.dylib */, + 9B5AA0A9209C41EC00E8B659 /* ss-local */, 1C82DBA31FA96C7400B32551 /* simple-obfs */, 9B16E5991F99FD0700E54DC5 /* icons8-Blind Filled-50.png */, + 9B5AA0AA209C42A900E8B659 /* privoxy */, 9B16E5971F99FD0700E54DC5 /* icons8-Eye Filled-50.png */, 9B938D931E864B38005F5636 /* menu_g_icon.png */, 9B938D941E864B38005F5636 /* menu_g_icon@2x.png */, @@ -324,38 +311,21 @@ 9B938D961E864B38005F5636 /* menu_m_icon@2x.png */, 9B938D971E864B38005F5636 /* menu_p_icon.png */, 9B938D981E864B38005F5636 /* menu_p_icon@2x.png */, - 9B3F7BF71E82BF2D00C68B75 /* libev.4.dylib */, - 9B3F7BF81E82BF2D00C68B75 /* libmbedcrypto.2.4.2.dylib */, - 9B3F7BFA1E82BF2E00C68B75 /* libudns.0.dylib */, - 9B5832101E742632009D5B7D /* kcptun_1.png */, 9B58320A1E7422DB009D5B7D /* http.png */, 9B5832061E7421B2009D5B7D /* virtual-server-icon-3.png */, 9B5832021E741F8D009D5B7D /* command-512.png */, - 9B9CBCAD1E263A6600FC61AA /* libpcre.1.dylib */, - 9B9CBCA91E2633CB00FC61AA /* kcptun_client */, 08FCA0FE1E24BE1A0070984F /* example-gui-config.json */, - C6D4298E1DA75988002A5711 /* install_privoxy.sh */, - C6D4298F1DA75988002A5711 /* privoxy */, - C6D429911DA75988002A5711 /* start_privoxy.sh */, - C6D429921DA75988002A5711 /* stop_privoxy.sh */, 9B172A6C1D0ADDDD00B87B9A /* Localizable.strings */, 9B3FFF4B1D09D8F70019A709 /* install_helper.sh */, 9B3FFF281D08A1DF0019A709 /* user-rule.txt */, 9B3FFF261D0898EB0019A709 /* gfwlist.txt */, 9B3FFF221D088E8D0019A709 /* abp.js */, - 9B07EFA61D048BBB0052D9DF /* ss-local */, 9B07EFA81D048E880052D9DF /* menu_icon@2x.png */, 9B07EFA91D048E880052D9DF /* menu_icon.png */, 9B07EFAA1D048E880052D9DF /* menu_icon_disabled.png */, 9B07EFAB1D048E880052D9DF /* menu_icon_disabled@2x.png */, - 9BEEF0651D04CB8500FC52B3 /* install_ss_local.sh */, - 9B9CBCA71E26310E00FC61AA /* install_kcptun.sh */, - 9BEEF0661D04CE8D00FC52B3 /* start_ss_local.sh */, - 9BEEF0671D04CE9A00FC52B3 /* stop_ss_local.sh */, - C6D429981DA76FBC002A5711 /* privoxy.config.example */, - 9B9CBCB01E2644DC00FC61AA /* start_kcptun.sh */, - 9B9CBCB11E26450D00FC61AA /* stop_kcptun.sh */, 9BBE7B711F50790500E8FFE5 /* fix_dir_owner.sh */, + 9B5AA0AB209C43C200E8B659 /* Credits.rtf */, ); name = "Support Files"; sourceTree = ""; @@ -400,7 +370,6 @@ 9B0BFFEC1D0460A70040E62B /* MainMenu.xib */, 9B0BFFEF1D0460A70040E62B /* Info.plist */, 9BEEF06D1D04DCE400FC52B3 /* ServerProfile.swift */, - 9B9CBCA51E25E1DB00FC61AA /* KcptunProfile.swift */, 9BEEF06F1D04DDB100FC52B3 /* ServerProfileManager.swift */, 9BEEF0771D04FE8A00FC52B3 /* LaunchAgentUtils.swift */, 9B3FFF0C1D05FEB30019A709 /* Utils.swift */, @@ -444,6 +413,8 @@ 9B86459C1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift */, 9B3546701E802B1200B510B4 /* ToastWindowController.swift */, 9B3546711E802B1200B510B4 /* ToastWindowController.xib */, + 9B7297E8214D7C6B00FD24AA /* ShareServerProfilesWindowController.swift */, + 9B7297EE214DA88A00FD24AA /* ShareServerProfilesWindowController.xib */, ); name = UI; sourceTree = ""; @@ -456,6 +427,34 @@ path = proxy_conf_helper; sourceTree = ""; }; + 9B5AA0A9209C41EC00E8B659 /* ss-local */ = { + isa = PBXGroup; + children = ( + 9B7297E5214D68F800FD24AA /* libmbedcrypto.2.12.0.dylib */, + 9B3F7BF71E82BF2D00C68B75 /* libev.4.dylib */, + 9B5AA09F209C100C00E8B659 /* libsodium.23.dylib */, + 9B5AA0A2209C103900E8B659 /* libcares.2.dylib */, + 9B9CBCAD1E263A6600FC61AA /* libpcre.1.dylib */, + 9B07EFA61D048BBB0052D9DF /* ss-local */, + 9BEEF0651D04CB8500FC52B3 /* install_ss_local.sh */, + 9BEEF0661D04CE8D00FC52B3 /* start_ss_local.sh */, + 9BEEF0671D04CE9A00FC52B3 /* stop_ss_local.sh */, + ); + name = "ss-local"; + sourceTree = ""; + }; + 9B5AA0AA209C42A900E8B659 /* privoxy */ = { + isa = PBXGroup; + children = ( + C6D429981DA76FBC002A5711 /* privoxy.config.example */, + C6D4298F1DA75988002A5711 /* privoxy */, + C6D4298E1DA75988002A5711 /* install_privoxy.sh */, + C6D429911DA75988002A5711 /* start_privoxy.sh */, + C6D429921DA75988002A5711 /* stop_privoxy.sh */, + ); + name = privoxy; + sourceTree = ""; + }; 9B9F13A21E8A282C00DE4794 /* Products */ = { isa = PBXGroup; children = ( @@ -550,7 +549,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 0930; ORGANIZATIONNAME = qiuyuzhou; TargetAttributes = { 9B0BFFE41D0460A70040E62B = { @@ -609,19 +608,16 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 9B7297E7214D69C300FD24AA /* libmbedcrypto.2.12.0.dylib in Resources */, + 9BCB1D6C20A15B0E005BABE7 /* libsodium.23.dylib in Resources */, + 9BCB1D6D20A15B0E005BABE7 /* libcares.2.dylib in Resources */, 9BBE7B751F508A0E00E8FFE5 /* fix_dir_owner.sh in Resources */, 9B3F7BFF1E82BF5B00C68B75 /* libev.4.dylib in Resources */, 1C82DBAA1FA96FB600B32551 /* install_simple_obfs.sh in Resources */, - 9B3F7C001E82BF5B00C68B75 /* libmbedcrypto.2.4.2.dylib in Resources */, - 9B3F7C021E82BF5B00C68B75 /* libudns.0.dylib in Resources */, - 9B9CBCB41E26453C00FC61AA /* start_kcptun.sh in Resources */, - 9B9CBCB51E26453C00FC61AA /* stop_kcptun.sh in Resources */, 9B938D9A1E864B38005F5636 /* menu_g_icon@2x.png in Resources */, 9B938D9E1E864B38005F5636 /* menu_p_icon@2x.png in Resources */, 9B9CBCAF1E263B1600FC61AA /* libpcre.1.dylib in Resources */, - 9B9CBCA81E26312E00FC61AA /* install_kcptun.sh in Resources */, 9B5832031E741F8D009D5B7D /* command-512.png in Resources */, - 9B9CBCAA1E2633CB00FC61AA /* kcptun_client in Resources */, 9B3FFF541D09E2D10019A709 /* proxy_conf_helper in Resources */, 9B5832071E7421B2009D5B7D /* virtual-server-icon-3.png in Resources */, 9BEEF0691D04D4D500FC52B3 /* install_ss_local.sh in Resources */, @@ -630,7 +626,6 @@ C6D429971DA75988002A5711 /* stop_privoxy.sh in Resources */, C8E42A6E1D4F2CAF0074C7EA /* UserRulesController.xib in Resources */, 9BEEF06A1D04D4D500FC52B3 /* start_ss_local.sh in Resources */, - 9B5832111E742632009D5B7D /* kcptun_1.png in Resources */, 9B16E59A1F99FD0700E54DC5 /* icons8-Eye Filled-50.png in Resources */, 9B938D9C1E864B38005F5636 /* menu_m_icon@2x.png in Resources */, 9B3546731E802B1200B510B4 /* ToastWindowController.xib in Resources */, @@ -646,6 +641,7 @@ 1C82DBA81FA96C7500B32551 /* obfs-local in Resources */, 9B938D9D1E864B38005F5636 /* menu_p_icon.png in Resources */, 9B938D9B1E864B38005F5636 /* menu_m_icon.png in Resources */, + 9B7297EC214DA88A00FD24AA /* ShareServerProfilesWindowController.xib in Resources */, 9B3FFF271D0898EB0019A709 /* gfwlist.txt in Resources */, C6D429931DA75988002A5711 /* install_privoxy.sh in Resources */, 9B58320B1E7422DB009D5B7D /* http.png in Resources */, @@ -655,6 +651,7 @@ 9B3FFF4C1D09D8F70019A709 /* install_helper.sh in Resources */, C6D429961DA75988002A5711 /* start_privoxy.sh in Resources */, 9B07EFAC1D048E880052D9DF /* menu_icon@2x.png in Resources */, + 9B5AA0AC209C43C200E8B659 /* Credits.rtf in Resources */, 9B07EFA71D048BBB0052D9DF /* ss-local in Resources */, 9B07EFAF1D048E880052D9DF /* menu_icon_disabled@2x.png in Resources */, 9B07EFAE1D048E880052D9DF /* menu_icon_disabled.png in Resources */, @@ -825,6 +822,7 @@ 9B5831F61E7302F8009D5B7D /* ShortcutsController.m in Sources */, 9BB706A71D1B982300551F0E /* SWBApplication.m in Sources */, 9B3FFF1E1D0732660019A709 /* Utils.m in Sources */, + 9B7297EA214D7C6B00FD24AA /* ShareServerProfilesWindowController.swift in Sources */, 9B3FFF321D08CEE40019A709 /* SWBQRCodeWindowController.m in Sources */, 9B3FFF211D08826E0019A709 /* PACUtils.swift in Sources */, 9B3FFF141D0705810019A709 /* Notifications.swift in Sources */, @@ -837,7 +835,6 @@ 9B5831FF1E741969009D5B7D /* PreferencesWinController.swift in Sources */, 9BEEF0781D04FE8A00FC52B3 /* LaunchAgentUtils.swift in Sources */, 9B3546721E802B1200B510B4 /* ToastWindowController.swift in Sources */, - 9B9CBCA61E25E1DB00FC61AA /* KcptunProfile.swift in Sources */, C8E42A6C1D4F270A0074C7EA /* UserRulesController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -902,6 +899,15 @@ name = PreferencesWindowController.xib; sourceTree = ""; }; + 9B7297EE214DA88A00FD24AA /* ShareServerProfilesWindowController.xib */ = { + isa = PBXVariantGroup; + children = ( + 9B7297ED214DA88A00FD24AA /* Base */, + 9B7297F0214DA89000FD24AA /* zh-Hans */, + ); + name = ShareServerProfilesWindowController.xib; + sourceTree = ""; + }; 9BAFE2E41E83ED7F00F71CCE /* PreferencesWinController.xib */ = { isa = PBXVariantGroup; children = ( @@ -937,12 +943,14 @@ 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; @@ -991,12 +999,14 @@ 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; diff --git a/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme b/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme index c5c11da1..e6e5758e 100644 --- a/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme +++ b/ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme @@ -1,6 +1,6 @@ @@ -46,7 +45,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/ShadowsocksX-NG/AppDelegate.swift b/ShadowsocksX-NG/AppDelegate.swift index a56fca0d..57096620 100755 --- a/ShadowsocksX-NG/AppDelegate.swift +++ b/ShadowsocksX-NG/AppDelegate.swift @@ -14,6 +14,7 @@ import RxSwift @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDelegate { + var shareWinCtrl: ShareServerProfilesWindowController! var qrcodeWinCtrl: SWBQRCodeWindowController! var preferencesWinCtrl: PreferencesWindowController! var editUserRulesWinCtrl: UserRulesController! @@ -80,7 +81,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele // Prepare ss-local InstallSSLocal() - InstallKcptunClient() InstallPrivoxy() InstallSimpleObfs() // Prepare defaults @@ -188,7 +188,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele func applicationWillTerminate(_ aNotification: Notification) { // Insert code here to tear down your application StopSSLocal() - StopKcptun() StopPrivoxy() ProxyConfHelper.disableProxy() } @@ -281,21 +280,49 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele } } - @IBAction func scanQRCodeFromScreen(_ sender: NSMenuItem) { - ScanQRCodeOnScreen() - } - - @IBAction func showBunchJsonExampleFile(sender: NSMenuItem) { - ServerProfileManager.showExampleConfigFile() + @IBAction func showShareServerProfiles(_ sender: NSMenuItem) { + if shareWinCtrl != nil { + shareWinCtrl.close() + } + shareWinCtrl = ShareServerProfilesWindowController(windowNibName: NSNib.Name(rawValue: "ShareServerProfilesWindowController")) + shareWinCtrl.showWindow(self) + NSApp.activate(ignoringOtherApps: true) + shareWinCtrl.window?.makeKeyAndOrderFront(nil) } - @IBAction func importBunchJsonFile(sender: NSMenuItem) { - ServerProfileManager.instance.importConfigFile() - //updateServersMenu()//not working + @IBAction func scanQRCodeFromScreen(_ sender: NSMenuItem) { + ScanQRCodeOnScreen() } - @IBAction func exportAllServerProfile(sender: NSMenuItem) { - ServerProfileManager.instance.exportConfigFile() + @IBAction func importProfileURLFromPasteboard(_ sender: NSMenuItem) { + let pb = NSPasteboard.general + if #available(OSX 10.13, *) { + if let text = pb.string(forType: NSPasteboard.PasteboardType.URL) { + if let url = URL(string: text) { + NotificationCenter.default.post( + name: Notification.Name(rawValue: "NOTIFY_FOUND_SS_URL"), object: nil + , userInfo: [ + "urls": [url], + "source": "pasteboard", + ]) + } + } + } + if let text = pb.string(forType: NSPasteboard.PasteboardType.string) { + var urls = text.split(separator: "\n") + .map { String($0).trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) } + .map { URL(string: $0) } + .filter { $0 != nil } + .map { $0! } + urls = urls.filter { $0.scheme == "ss" } + + NotificationCenter.default.post( + name: Notification.Name(rawValue: "NOTIFY_FOUND_SS_URL"), object: nil + , userInfo: [ + "urls": urls, + "source": "pasteboard", + ]) + } } @IBAction func selectPACMode(_ sender: NSMenuItem) { @@ -385,6 +412,14 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele NSWorkspace.shared.open(URL(string: "https://github.com/qiuyuzhou/ShadowsocksX-NG/issues")!) } + @IBAction func checkForUpdates(_ sender: NSMenuItem) { + NSWorkspace.shared.open(URL(string: "https://github.com/shadowsocks/ShadowsocksX-NG/releases")!) + } + + @IBAction func showHelp(_ sender: NSMenuItem) { + NSWorkspace.shared.open(URL(string: "https://github.com/shadowsocks/ShadowsocksX-NG/wiki")!) + } + @IBAction func showAbout(_ sender: NSMenuItem) { NSApp.orderFrontStandardAboutPanel(sender); NSApp.activate(ignoringOtherApps: true) @@ -535,29 +570,30 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele let urls: [URL] = userInfo["urls"] as! [URL] let mgr = ServerProfileManager.instance - var isChanged = false + var addCount = 0 + + var subtitle: String = "" + if userInfo["source"] as! String == "qrcode" { + subtitle = "By scan QR Code".localized + } else if userInfo["source"] as! String == "url" { + subtitle = "By handle SS URL".localized + } else if userInfo["source"] as! String == "pasteboard" { + subtitle = "By import from pasteboard".localized + } for url in urls { if let profile = ServerProfile(url: url) { mgr.profiles.append(profile) - isChanged = true - - var subtitle: String = "" - if userInfo["source"] as! String == "qrcode" { - subtitle = "By scan QR Code".localized - } else if userInfo["source"] as! String == "url" { - subtitle = "By Handle SS URL".localized - } - - sendNotify("Add Shadowsocks Server Profile".localized, subtitle, "Host: \(profile.serverHost)") + addCount = addCount + 1 } } - if isChanged { + if addCount > 0 { + sendNotify("Add \(addCount) Shadowsocks Server Profile".localized, subtitle, "") mgr.save() self.updateServersMenu() } else { - sendNotify("Not found valid qrcode of shadowsocks profile.", "", "") + sendNotify("", "", "Not found valid qrcode or url of shadowsocks profile".localized) } } } diff --git a/ShadowsocksX-NG/Base.lproj/Localizable.strings b/ShadowsocksX-NG/Base.lproj/Localizable.strings index c3ce1118..fd28729f 100755 --- a/ShadowsocksX-NG/Base.lproj/Localizable.strings +++ b/ShadowsocksX-NG/Base.lproj/Localizable.strings @@ -20,7 +20,9 @@ * ./AppDelegate.swift */ -"Add Shadowsocks Server Profile" = "Add Shadowsocks Server Profile"; +"Add \(addCount) Shadowsocks Server Profile" = "Add \(addCount) Shadowsocks Server Profile"; + +"Not found valid qrcode or url of shadowsocks profile" = "Not found valid qrcode or url of shadowsocks profile"; "By scan QR Code" = "By scan QR Code"; diff --git a/ShadowsocksX-NG/Base.lproj/MainMenu.xib b/ShadowsocksX-NG/Base.lproj/MainMenu.xib index 0dd241d1..3bde40b7 100755 --- a/ShadowsocksX-NG/Base.lproj/MainMenu.xib +++ b/ShadowsocksX-NG/Base.lproj/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -23,7 +23,6 @@ - @@ -72,37 +71,25 @@ - - - - - - - - - - - - - - - - - - - + - + - + + + + + + + @@ -136,6 +123,18 @@ + + + + + + + + + + + + diff --git a/ShadowsocksX-NG/Base.lproj/PreferencesWinController.xib b/ShadowsocksX-NG/Base.lproj/PreferencesWinController.xib index 8d868faf..45a77dfa 100644 --- a/ShadowsocksX-NG/Base.lproj/PreferencesWinController.xib +++ b/ShadowsocksX-NG/Base.lproj/PreferencesWinController.xib @@ -1,8 +1,8 @@ - + - + @@ -19,7 +19,7 @@ - + @@ -382,97 +382,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -633,11 +542,6 @@ - - - - - @@ -653,7 +557,6 @@ - @@ -689,6 +592,5 @@ - diff --git a/ShadowsocksX-NG/Base.lproj/PreferencesWindowController.xib b/ShadowsocksX-NG/Base.lproj/PreferencesWindowController.xib index 6411ddac..432778ac 100644 --- a/ShadowsocksX-NG/Base.lproj/PreferencesWindowController.xib +++ b/ShadowsocksX-NG/Base.lproj/PreferencesWindowController.xib @@ -1,8 +1,8 @@ - + - + @@ -10,19 +10,7 @@ - - - - - - - - - - - - @@ -41,20 +29,21 @@ - - + + - + - - - - + + + + + - + @@ -100,334 +89,106 @@ - - - - + + + + + - - + + + - - - - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSAllRomanInputSourcesLocaleIdentifier - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NSAllRomanInputSourcesLocaleIdentifier - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -440,17 +201,19 @@ - - + + + - + - + + @@ -461,11 +224,6 @@ - - - - - @@ -473,8 +231,9 @@ - + + @@ -482,20 +241,13 @@ - - - - - - - - + + + - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/ShadowsocksX-NG/Base.lproj/ShareServerProfilesWindowController.xib b/ShadowsocksX-NG/Base.lproj/ShareServerProfilesWindowController.xib new file mode 100644 index 00000000..04117b19 --- /dev/null +++ b/ShadowsocksX-NG/Base.lproj/ShareServerProfilesWindowController.xib @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ShadowsocksX-NG/Credits.rtf b/ShadowsocksX-NG/Credits.rtf new file mode 100644 index 00000000..dff81b78 --- /dev/null +++ b/ShadowsocksX-NG/Credits.rtf @@ -0,0 +1,16 @@ +{\rtf1\ansi\ansicpg936\cocoartf1561\cocoasubrtf600 +{\fonttbl\f0\fnil\fcharset134 STHeitiSC-Light;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\paperw12240\paperh15840\margl1440\margr1440\vieww12420\viewh9780\viewkind0 +\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 +{\field{\*\fldinst{HYPERLINK "https://github.com/shadowsocks/shadowsocks-libev"}}{\fldrslt +\f0\fs24 \cf0 ss-local}} +\f0\fs24 v3.2.0\ +\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 +{\field{\*\fldinst{HYPERLINK "https://github.com/shadowsocks/kcptun"}}{\fldrslt \cf0 kcptun}} v20170718\ +\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 +{\field{\*\fldinst{HYPERLINK "https://github.com/shadowsocks/simple-obfs"}}{\fldrslt \cf0 simple-obfs}} v0.0.5\ +\pard\tx560\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 +{\field{\*\fldinst{HYPERLINK "https://www.privoxy.org/"}}{\fldrslt \cf0 privoxy}} v3.0.26\ +} \ No newline at end of file diff --git a/ShadowsocksX-NG/Info.plist b/ShadowsocksX-NG/Info.plist index bc289f39..c48f1b80 100644 --- a/ShadowsocksX-NG/Info.plist +++ b/ShadowsocksX-NG/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.7.1 + 1.8.0 CFBundleSignature ???? CFBundleURLTypes @@ -44,7 +44,7 @@ LSUIElement NSHumanReadableCopyright - Copyright © 2016-2017 qiuyuzhou. All rights reserved. License GPLv3. + Copyright © 2016-2018 qiuyuzhou. All rights reserved. License GPLv3. NSMainNibFile MainMenu NSPrincipalClass diff --git a/ShadowsocksX-NG/KcptunProfile.swift b/ShadowsocksX-NG/KcptunProfile.swift deleted file mode 100644 index f874c522..00000000 --- a/ShadowsocksX-NG/KcptunProfile.swift +++ /dev/null @@ -1,150 +0,0 @@ -// -// KcptunProfile.swift -// ShadowsocksX-NG -// -// Created by 邱宇舟 on 2017/1/11. -// Copyright © 2017年 qiuyuzhou. All rights reserved. -// - -import Foundation - - -class KcptunProfile: NSObject, NSCopying { - - @objc var mode: String = "fast" - - @objc var key: String = "it's a secrect" - @objc var crypt: String = "aes" - @objc var nocomp: Bool = false - @objc var datashard: uint = 10 - @objc var parityshard: uint = 3 - @objc var mtu: uint = 1350 - @objc var arguments: String = "" - - - public func copy(with zone: NSZone? = nil) -> Any { - let copy = KcptunProfile() - copy.mode = self.mode - copy.key = self.key - copy.crypt = self.crypt - copy.nocomp = self.nocomp - copy.datashard = self.datashard - copy.parityshard = self.parityshard - copy.mtu = self.mtu - return copy; - } - - func toDictionary() -> [String:AnyObject] { - let conf: [String: AnyObject] = [ - "mode": self.mode as AnyObject, - "key": self.key as AnyObject, - "crypt": self.crypt as AnyObject, - "nocomp": NSNumber(value: self.nocomp), - "datashard": NSNumber(value: self.datashard), - "parityshard": NSNumber(value: self.parityshard), - "mtu": NSNumber(value: self.mtu), - "arguments": self.arguments as AnyObject, - ] - return conf - } - - static func fromDictionary(_ data:[String:Any?]) -> KcptunProfile { - let profile = KcptunProfile() - profile.mode = data["mode"] as! String - profile.key = data["key"] as! String - profile.crypt = data["crypt"] as! String - profile.nocomp = (data["nocomp"] as! NSNumber).boolValue - profile.datashard = uint((data["datashard"] as! NSNumber).uintValue) - profile.parityshard = uint((data["parityshard"] as! NSNumber).uintValue) - if let v = data["mtu"] as? NSNumber { - profile.mtu = uint(v.uintValue) - } - if let arguments = data["arguments"] as? String { - profile.arguments = arguments - } - - return profile - } - - func toJsonConfig() -> [String: AnyObject] { - let defaults = UserDefaults.standard - let localHost = defaults.string(forKey: "Kcptun.LocalHost")! as String - let localPort = defaults.integer(forKey: "Kcptun.LocalPort") - let connNum = defaults.integer(forKey: "Kcptun.Conn") - - let conf: [String: AnyObject] = [ - "localaddr": "\(localHost):\(localPort)" as AnyObject, - "mode": self.mode as AnyObject, - "key": self.key as AnyObject, - "crypt": self.crypt as AnyObject, - "nocomp": NSNumber(value: self.nocomp), - "datashard": NSNumber(value: self.datashard), - "parityshard": NSNumber(value: self.parityshard), - "mtu": NSNumber(value: self.mtu), - "conn": NSNumber(value: connNum), - ] - return conf - } - - func urlQueryItems() -> [URLQueryItem] { - return [ - URLQueryItem(name: "mode", value: mode), - URLQueryItem(name: "key", value: key), - URLQueryItem(name: "crypt", value: crypt), - URLQueryItem(name: "datashard", value: "\(datashard)"), - URLQueryItem(name: "parityshard", value: "\(parityshard)"), - URLQueryItem(name: "nocomp", value: nocomp.description), - URLQueryItem(name: "mtu", value: "\(mtu)"), - URLQueryItem(name: "arguments", value: arguments), - ] - } - - func loadUrlQueryItems(items: [URLQueryItem]) { - for item in items { - switch item.name { - case "mode": - if let v = item.value { - mode = v - } - case "key": - if let v = item.value { - key = v - } - case "crypt": - if let v = item.value { - crypt = v - } - case "datashard": - if let v = item.value { - if let vv = uint(v) { - datashard = vv - } - } - case "parityshard": - if let v = item.value { - if let vv = uint(v) { - parityshard = vv - } - } - case "nocomp": - if let v = item.value { - if let vv = Bool(v) { - nocomp = vv - } - } - case "mtu": - if let v = item.value { - if let vv = uint(v) { - mtu = vv - } - } - case "arguments": - if let v = item.value { - arguments = v - } - default: - continue - } - } - } -} diff --git a/ShadowsocksX-NG/LaunchAgentUtils.swift b/ShadowsocksX-NG/LaunchAgentUtils.swift index 52004431..9b410aa2 100644 --- a/ShadowsocksX-NG/LaunchAgentUtils.swift +++ b/ShadowsocksX-NG/LaunchAgentUtils.swift @@ -9,9 +9,9 @@ import Foundation let SS_LOCAL_VERSION = "3.1.3" -let KCPTUN_CLIENT_VERSION = "20170322" +let KCPTUN_CLIENT_VERSION = "v20170718" let PRIVOXY_VERSION = "3.0.26.static" -let SIMPLE_OBFS_VERSION = "0.0.2" +let SIMPLE_OBFS_VERSION = "0.0.5" let APP_SUPPORT_DIR = "/Library/Application Support/ShadowsocksX-NG/" let LAUNCH_AGENT_DIR = "/Library/LaunchAgents/" let LAUNCH_AGENT_CONF_SSLOCAL_NAME = "com.qiuyuzhou.shadowsocksX-NG.local.plist" @@ -59,13 +59,18 @@ func generateSSLocalLauchAgentPlist() -> Bool { arguments.append("--reuse-port") // For a complete listing of the keys, see the launchd.plist manual page. + let dyld_library_paths = [ + NSHomeDirectory() + APP_SUPPORT_DIR + "ss-local-latest/", + NSHomeDirectory() + APP_SUPPORT_DIR + "plugins/", + ] + let dict: NSMutableDictionary = [ "Label": "com.qiuyuzhou.shadowsocksX-NG.local", "WorkingDirectory": NSHomeDirectory() + APP_SUPPORT_DIR, "StandardOutPath": logFilePath, "StandardErrorPath": logFilePath, "ProgramArguments": arguments, - "EnvironmentVariables": ["DYLD_LIBRARY_PATH": NSHomeDirectory() + APP_SUPPORT_DIR + "ss-local-latest/"] + "EnvironmentVariables": ["DYLD_LIBRARY_PATH": dyld_library_paths.joined(separator: ":")] ] dict.write(toFile: plistFilepath, atomically: true) let Sha1Sum = getFileSHA1Sum(plistFilepath) @@ -182,7 +187,6 @@ func SyncSSLocal() { } SyncPac() SyncPrivoxy() - SyncKcptun() } // -------------------------------------------------------------------------------- @@ -347,163 +351,3 @@ func SyncPrivoxy() { StopPrivoxy() } } - -// -------------------------------------------------------------------------------- -// kcptun - -func generateKcptunLauchAgentPlist() -> Bool { - let sslocalPath = NSHomeDirectory() + APP_SUPPORT_DIR + "kcptun_client" - let logFilePath = NSHomeDirectory() + "/Library/Logs/kcptun_client.log" - let launchAgentDirPath = NSHomeDirectory() + LAUNCH_AGENT_DIR - let plistFilepath = launchAgentDirPath + LAUNCH_AGENT_CONF_KCPTUN_NAME - - // Ensure launch agent directory is existed. - let fileMgr = FileManager.default - if !fileMgr.fileExists(atPath: launchAgentDirPath) { - try! fileMgr.createDirectory(atPath: launchAgentDirPath, withIntermediateDirectories: true, attributes: nil) - } - - let oldSha1Sum = getFileSHA1Sum(plistFilepath) - - var arguments = [sslocalPath, "-c", "kcptun-config.json"] - - let mgr = ServerProfileManager.instance - if let profile = mgr.getActiveProfile() { - if profile.enabledKcptun { - let otherArgumentsLine = profile.kcptunProfile.arguments.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) - if !otherArgumentsLine.isEmpty { - // TOFIX: Don't support space between quotation marks - let otherArguments = otherArgumentsLine.components(separatedBy: " ") - arguments.append(contentsOf: otherArguments.filter { !$0.isEmpty }) - } - } - } - - // For a complete listing of the keys, see the launchd.plist manual page. - let dict: NSMutableDictionary = [ - "Label": "com.qiuyuzhou.shadowsocksX-NG.kcptun", - "WorkingDirectory": NSHomeDirectory() + APP_SUPPORT_DIR, - "StandardOutPath": logFilePath, - "StandardErrorPath": logFilePath, - "ProgramArguments": arguments, - "EnvironmentVariables": ["DYLD_LIBRARY_PATH": NSHomeDirectory() + APP_SUPPORT_DIR] - ] - dict.write(toFile: plistFilepath, atomically: true) - let Sha1Sum = getFileSHA1Sum(plistFilepath) - if oldSha1Sum != Sha1Sum { - return true - } else { - return false - } -} - -func InstallKcptunClient() { - let fileMgr = FileManager.default - let homeDir = NSHomeDirectory() - let appSupportDir = homeDir+APP_SUPPORT_DIR - if !fileMgr.fileExists(atPath: appSupportDir + "kcptun_\(KCPTUN_CLIENT_VERSION)/kcptun_client") { - let bundle = Bundle.main - let installerPath = bundle.path(forResource: "install_kcptun", ofType: "sh") - let task = Process.launchedProcess(launchPath: installerPath!, arguments: [""]) - task.waitUntilExit() - if task.terminationStatus == 0 { - NSLog("Install kcptun succeeded.") - } else { - NSLog("Install kcptun failed.") - } - } -} - -func writeKcptunConfFile(_ conf:[String:AnyObject]) -> Bool { - do { - let filepath = NSHomeDirectory() + APP_SUPPORT_DIR + "kcptun-config.json" - let data: Data = try JSONSerialization.data(withJSONObject: conf, options: .prettyPrinted) - - let oldSum = getFileSHA1Sum(filepath) - try data.write(to: URL(fileURLWithPath: filepath), options: .atomic) - let newSum = getFileSHA1Sum(filepath) - - if oldSum == newSum { - return false - } - - return true - } catch { - NSLog("Write kcptun config file failed.") - } - return false -} - -func isEnabledKcptun() -> Bool { - let mgr = ServerProfileManager.instance - if let profile = mgr.getActiveProfile() { - return profile.enabledKcptun - } - return false -} - -func removeKcptunConfFile() { - do { - let filepath = NSHomeDirectory() + APP_SUPPORT_DIR + "kcptun-config.json" - try FileManager.default.removeItem(atPath: filepath) - } catch { - - } -} - -func StartKcptun() { - if isEnabledKcptun() { - let bundle = Bundle.main - let installerPath = bundle.path(forResource: "start_kcptun.sh", ofType: nil) - let task = Process.launchedProcess(launchPath: installerPath!, arguments: [""]) - task.waitUntilExit() - if task.terminationStatus == 0 { - NSLog("Start kcptun succeeded.") - } else { - NSLog("Start kcptun failed.") - } - } -} - -func StopKcptun() { - let bundle = Bundle.main - let installerPath = bundle.path(forResource: "stop_kcptun.sh", ofType: nil) - let task = Process.launchedProcess(launchPath: installerPath!, arguments: [""]) - task.waitUntilExit() - if task.terminationStatus == 0 { - NSLog("Stop kcptun succeeded.") - } else { - NSLog("Stop kcptun failed.") - } -} - -func SyncKcptun() { - var changed: Bool = false - changed = changed || generateKcptunLauchAgentPlist() - let mgr = ServerProfileManager.instance - if let profile = mgr.getActiveProfile() { - if profile.enabledKcptun { - changed = changed || writeKcptunConfFile(profile.toKcptunJsonConfig()) - - let on = UserDefaults.standard.bool(forKey: "ShadowsocksOn") - if on { - if changed { - StopKcptun() - DispatchQueue.main.asyncAfter( - deadline: DispatchTime.now() + DispatchTimeInterval.seconds(1), - execute: { - () in - StartKcptun() - }) - } else { - StartKcptun() - } - } else { - StopKcptun() - } - return - } - } - StopKcptun() - removeKcptunConfFile() -} diff --git a/ShadowsocksX-NG/PreferencesWinController.swift b/ShadowsocksX-NG/PreferencesWinController.swift index 8102190d..f13fe9d7 100644 --- a/ShadowsocksX-NG/PreferencesWinController.swift +++ b/ShadowsocksX-NG/PreferencesWinController.swift @@ -33,7 +33,7 @@ class PreferencesWinController: NSWindowController { @IBAction func resetProxyExceptions(sender: NSButton) { let defaults = UserDefaults.standard - defaults.set("127.0.0.1, localhost, 192.168.0.0/16, 10.0.0.0/8", forKey: "ProxyExceptions") + defaults.set("127.0.0.1, localhost, 192.168.0.0/16, 10.0.0.0/8, FE80::/64, ::1, FD00::/8", forKey: "ProxyExceptions") } - + } diff --git a/ShadowsocksX-NG/PreferencesWindowController.swift b/ShadowsocksX-NG/PreferencesWindowController.swift index eb9514da..f426446d 100644 --- a/ShadowsocksX-NG/PreferencesWindowController.swift +++ b/ShadowsocksX-NG/PreferencesWindowController.swift @@ -16,11 +16,9 @@ class PreferencesWindowController: NSWindowController @IBOutlet weak var profilesTableView: NSTableView! @IBOutlet weak var profileBox: NSBox! - @IBOutlet weak var kcptunProfileBox: NSBox! @IBOutlet weak var hostTextField: NSTextField! @IBOutlet weak var portTextField: NSTextField! - @IBOutlet weak var kcptunPortTextField: NSTextField! @IBOutlet weak var methodTextField: NSComboBox! @IBOutlet weak var passwordTabView: NSTabView! @@ -29,30 +27,15 @@ class PreferencesWindowController: NSWindowController @IBOutlet weak var togglePasswordVisibleButton: NSButton! @IBOutlet weak var pluginTextField: NSTextField! @IBOutlet weak var pluginOptionsTextField: NSTextField! - @IBOutlet weak var remarkTextField: NSTextField! - - @IBOutlet weak var otaCheckBoxBtn: NSButton! - - @IBOutlet weak var kcptunCheckBoxBtn: NSButton! - @IBOutlet weak var kcptunCryptComboBox: NSComboBox! - @IBOutlet weak var kcptunKeyTextField: NSTextField! - @IBOutlet weak var kcptunModeComboBox: NSComboBox! - @IBOutlet weak var kcptunNocompCheckBoxBtn: NSButton! - @IBOutlet weak var kcptunDatashardTextField: NSTextField! - @IBOutlet weak var kcptunParityshardTextField: NSTextField! - @IBOutlet weak var kcptunMTUTextField: NSTextField! - @IBOutlet weak var kcptunArgumentsTextField: NSTextField! - @IBOutlet weak var removeButton: NSButton! + let tableViewDragType: String = "ss.server.profile.data" var defaults: UserDefaults! var profileMgr: ServerProfileManager! var editingProfile: ServerProfile! - - var enabledKcptunSubDisosable: Disposable? override func windowDidLoad() { @@ -78,35 +61,13 @@ class PreferencesWindowController: NSWindowController "camellia-256-cfb", "bf-cfb", "chacha20-ietf-poly1305", + "xchacha20-ietf-poly1305", "salsa20", "chacha20", "chacha20-ietf", "rc4-md5", ]) - kcptunCryptComboBox.addItems(withObjectValues: [ - "none", - "aes", - "aes-128", - "aes-192", - "salsa20", - "blowfish", - "twofish", - "cast5", - "3des", - "tea", - "xtea", - "xor", - ]) - - kcptunModeComboBox.addItems(withObjectValues: [ - "default", - "normal", - "fast", - "fast2", - "fast3", - ]) - profilesTableView.reloadData() updateProfileBoxVisible() } @@ -164,7 +125,6 @@ class PreferencesWindowController: NSWindowController profileMgr.save() window?.performClose(nil) - NotificationCenter.default .post(name: NOTIFY_SERVER_PROFILES_CHANGED, object: nil) } @@ -204,6 +164,11 @@ class PreferencesWindowController: NSWindowController } } + @IBAction func openPluginHelp(_ sender: Any) { + let url = URL(string: "https://github.com/shadowsocks/ShadowsocksX-NG/wiki/SIP003-Plugin") + NSWorkspace.shared.open(url!) + } + @IBAction func copyCurrentProfileURL2Pasteboard(_ sender: NSButton) { let index = profilesTableView.selectedRow if index >= 0 { @@ -240,21 +205,10 @@ class PreferencesWindowController: NSWindowController func bindProfile(_ index:Int) { NSLog("bind profile \(index)") - if let dis = enabledKcptunSubDisosable { - dis.dispose() - enabledKcptunSubDisosable = Optional.none - } + if index >= 0 && index < profileMgr.profiles.count { editingProfile = profileMgr.profiles[index] - - enabledKcptunSubDisosable = editingProfile.rx.observeWeakly(Bool.self, "enabledKcptun") - .subscribe(onNext: { v in - if let enabled = v { - self.portTextField.isEnabled = !enabled - } - }) - hostTextField.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "serverHost" , options: [NSBindingOption.continuouslyUpdatesValue: true]) portTextField.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "serverPort" @@ -274,43 +228,6 @@ class PreferencesWindowController: NSWindowController remarkTextField.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "remark" , options: [NSBindingOption.continuouslyUpdatesValue: true]) - - otaCheckBoxBtn.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "ota" - , options: [NSBindingOption.continuouslyUpdatesValue: true]) - - // -------------------------------------------------- - // Kcptun - kcptunCheckBoxBtn.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "enabledKcptun" - , options: [NSBindingOption.continuouslyUpdatesValue: true]) - - kcptunPortTextField.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "serverPort" - , options: [NSBindingOption.continuouslyUpdatesValue: true]) - - kcptunProfileBox.bind(NSBindingName(rawValue: "Hidden"), to: editingProfile, withKeyPath: "enabledKcptun" - , options: [NSBindingOption.continuouslyUpdatesValue: false, - NSBindingOption.valueTransformerName: NSValueTransformerName.negateBooleanTransformerName]) - - kcptunNocompCheckBoxBtn.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "kcptunProfile.nocomp", options: nil) - - kcptunModeComboBox.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "kcptunProfile.mode", options: nil) - - kcptunCryptComboBox.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "kcptunProfile.crypt", options: nil) - - kcptunKeyTextField.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "kcptunProfile.key" - , options: [NSBindingOption.continuouslyUpdatesValue: true]) - - kcptunDatashardTextField.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "kcptunProfile.datashard" - , options: [NSBindingOption.continuouslyUpdatesValue: true]) - - kcptunParityshardTextField.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "kcptunProfile.parityshard" - , options: [NSBindingOption.continuouslyUpdatesValue: true]) - - kcptunMTUTextField.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "kcptunProfile.mtu" - , options: [NSBindingOption.continuouslyUpdatesValue: true]) - - kcptunArgumentsTextField.bind(NSBindingName(rawValue: "value"), to: editingProfile, withKeyPath: "kcptunProfile.arguments" - , options: [NSBindingOption.continuouslyUpdatesValue: true]) - } else { editingProfile = nil hostTextField.unbind(NSBindingName(rawValue: "value")) @@ -320,10 +237,6 @@ class PreferencesWindowController: NSWindowController passwordTextField.unbind(NSBindingName(rawValue: "value")) remarkTextField.unbind(NSBindingName(rawValue: "value")) - - otaCheckBoxBtn.unbind(NSBindingName(rawValue: "value")) - - kcptunCheckBoxBtn.unbind(NSBindingName(rawValue: "value")) } } diff --git a/ShadowsocksX-NG/ProxyInterfacesViewCtrl.swift b/ShadowsocksX-NG/ProxyInterfacesViewCtrl.swift index 10cd2104..12ee19b6 100644 --- a/ShadowsocksX-NG/ProxyInterfacesViewCtrl.swift +++ b/ShadowsocksX-NG/ProxyInterfacesViewCtrl.swift @@ -28,7 +28,7 @@ class ProxyInterfacesViewCtrl: NSViewController, NSTableViewDataSource, NSTableV selectedNetworkServices = NSMutableSet() } - networkServices = ProxyConfTool.networkServicesList() as NSArray! + networkServices = ProxyConfTool.networkServicesList() as NSArray? tableView.reloadData() } diff --git a/ShadowsocksX-NG/SWBQRCodeWindowController.m b/ShadowsocksX-NG/SWBQRCodeWindowController.m index b2651f73..1af933a7 100644 --- a/ShadowsocksX-NG/SWBQRCodeWindowController.m +++ b/ShadowsocksX-NG/SWBQRCodeWindowController.m @@ -23,9 +23,8 @@ - (void)windowDidLoad { } - (void)setQRCode:(NSString*) qrCode withOverlayText: (NSString*) text { - CGImageRef cgImgRef = [self createQRImageForString:qrCode size:CGSizeMake(250, 250)]; + NSImage *image = [self createQRImageForString:qrCode size:NSMakeSize(250, 250)]; - NSImage *image = [[NSImage alloc]initWithCGImage:cgImgRef size:CGSizeMake(250, 250)]; if (text) { // Draw overlay text NSDictionary* attrs = @{ @@ -43,7 +42,10 @@ - (void)setQRCode:(NSString*) qrCode withOverlayText: (NSString*) text { self.imageView.image = image; } -- (CGImageRef)createQRImageForString:(NSString *)string size:(CGSize)size { +- (NSImage*)createQRImageForString:(NSString *)string size:(NSSize)size { + NSImage *outputImage = [[NSImage alloc]initWithSize:size]; + [outputImage lockFocus]; + // Setup the QR filter with our string CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; [filter setDefaults]; @@ -64,33 +66,19 @@ - (CGImageRef)createQRImageForString:(NSString *)string size:(CGSize)size { CGRect extent = CGRectIntegral(image.extent); CGFloat scale = MIN(size.width / CGRectGetWidth(extent), size.height / CGRectGetHeight(extent)); - // Since CoreImage nicely interpolates, we need to create a bitmap image that we'll draw into - // a bitmap context at the desired size; - size_t width = CGRectGetWidth(extent) * scale; - size_t height = CGRectGetHeight(extent) * scale; - CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray(); - CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone); - -#if TARGET_OS_IPHONE - CIContext *context = [CIContext contextWithOptions: @{kCIContextUseSoftwareRenderer: true}]; -#else - CIContext *context = [CIContext contextWithCGContext:bitmapRef options:@{kCIContextUseSoftwareRenderer: @true}]; -#endif - - CGImageRef bitmapImage = [context createCGImage:image fromRect:extent]; + CGImageRef bitmapImage = [NSGraphicsContext.currentContext.CIContext createCGImage:image fromRect:extent]; - CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone); - CGContextScaleCTM(bitmapRef, scale, scale); - CGContextDrawImage(bitmapRef, extent, bitmapImage); + CGContextRef graphicsContext = NSGraphicsContext.currentContext.CGContext; - // Create an image with the contents of our bitmap - CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef); + CGContextSetInterpolationQuality(graphicsContext, kCGInterpolationNone); + CGContextScaleCTM(graphicsContext, scale, scale); + CGContextDrawImage(graphicsContext, extent, bitmapImage); // Cleanup - CGContextRelease(bitmapRef); CGImageRelease(bitmapImage); - return scaledImage; + [outputImage unlockFocus]; + return outputImage; } - (IBAction) copyQRCode: (id) sender{ diff --git a/ShadowsocksX-NG/ServerProfile.swift b/ShadowsocksX-NG/ServerProfile.swift index efc61737..bc8d8d9f 100644 --- a/ShadowsocksX-NG/ServerProfile.swift +++ b/ShadowsocksX-NG/ServerProfile.swift @@ -18,10 +18,6 @@ class ServerProfile: NSObject, NSCopying { @objc var method:String = "aes-128-gcm" @objc var password:String = "" @objc var remark:String = "" - @objc var ota: Bool = false // onetime authentication - - @objc var enabledKcptun: Bool = false - @objc var kcptunProfile = KcptunProfile() // SIP003 Plugin @objc var plugin: String = "" // empty string disables plugin @@ -39,7 +35,7 @@ class ServerProfile: NSObject, NSCopying { self.init() func padBase64(string: String) -> String { - var length = string.characters.count + var length = string.utf8.count if length % 4 == 0 { return string } else { @@ -90,7 +86,7 @@ class ServerProfile: NSObject, NSCopying { return nil } - let parts = userInfo.characters.split(separator: ":", maxSplits: 1, omittingEmptySubsequences: false) + let parts = userInfo.split(separator: ":", maxSplits: 1, omittingEmptySubsequences: false) if parts.count != 2 { return nil } @@ -103,21 +99,6 @@ class ServerProfile: NSObject, NSCopying { } } - if let otaStr = parsedUrl.queryItems? - .filter({ $0.name == "OTA" }).first?.value { - ota = NSString(string: otaStr).boolValue - } - if let enabledKcptunStr = parsedUrl.queryItems? - .filter({ $0.name == "Kcptun" }).first?.value { - enabledKcptun = NSString(string: enabledKcptunStr).boolValue - } - - if enabledKcptun { - if let items = parsedUrl.queryItems { - self.kcptunProfile.loadUrlQueryItems(items: items) - } - } - if let pluginStr = parsedUrl.queryItems? .filter({ $0.name == "plugin" }).first?.value { let parts = pluginStr.split(separator: ";", maxSplits: 1) @@ -135,10 +116,7 @@ class ServerProfile: NSObject, NSCopying { copy.method = self.method copy.password = self.password copy.remark = self.remark - copy.ota = self.ota - copy.enabledKcptun = self.enabledKcptun - copy.kcptunProfile = self.kcptunProfile.copy() as! KcptunProfile copy.plugin = self.plugin copy.pluginOptions = self.pluginOptions return copy; @@ -154,15 +132,6 @@ class ServerProfile: NSObject, NSCopying { if let remark = data["Remark"] { profile.remark = remark as! String } - if let ota = data["OTA"] { - profile.ota = ota as! Bool - } - if let enabledKcptun = data["EnabledKcptun"] { - profile.enabledKcptun = enabledKcptun as! Bool - } - if let kcptunData = data["KcptunProfile"] { - profile.kcptunProfile = KcptunProfile.fromDictionary(kcptunData as! [String:Any?]) - } if let plugin = data["Plugin"] as? String { profile.plugin = plugin } @@ -190,9 +159,6 @@ class ServerProfile: NSObject, NSCopying { d["Method"] = method as AnyObject? d["Password"] = password as AnyObject? d["Remark"] = remark as AnyObject? - d["OTA"] = ota as AnyObject? - d["EnabledKcptun"] = NSNumber(value: enabledKcptun) - d["KcptunProfile"] = kcptunProfile.toDictionary() as AnyObject d["Plugin"] = plugin as AnyObject d["PluginOptions"] = pluginOptions as AnyObject return d @@ -206,20 +172,8 @@ class ServerProfile: NSObject, NSCopying { conf["local_port"] = NSNumber(value: UInt16(defaults.integer(forKey: "LocalSocks5.ListenPort")) as UInt16) conf["local_address"] = defaults.string(forKey: "LocalSocks5.ListenAddress") as AnyObject? conf["timeout"] = NSNumber(value: UInt32(defaults.integer(forKey: "LocalSocks5.Timeout")) as UInt32) - if ota { - conf["auth"] = NSNumber(value: ota as Bool) - } - - if enabledKcptun { - let localHost = defaults.string(forKey: "Kcptun.LocalHost") - let localPort = uint16(defaults.integer(forKey: "Kcptun.LocalPort")) - - conf["server"] = localHost as AnyObject - conf["server_port"] = NSNumber(value: localPort as UInt16) - } else { - conf["server"] = serverHost as AnyObject - conf["server_port"] = NSNumber(value: serverPort as UInt16) - } + conf["server"] = serverHost as AnyObject + conf["server_port"] = NSNumber(value: serverPort as UInt16) if !plugin.isEmpty { // all plugin binaries should be located in the plugins dir @@ -230,17 +184,6 @@ class ServerProfile: NSObject, NSCopying { return conf } - - func toKcptunJsonConfig() -> [String: AnyObject] { - var conf = kcptunProfile.toJsonConfig() - if serverHost.contains(Character(":")) { - conf["remoteaddr"] = "[\(serverHost)]:\(serverPort)" as AnyObject - } else { - conf["remoteaddr"] = "\(serverHost):\(serverPort)" as AnyObject - } - - return conf - } func isValid() -> Bool { func validateIpAddress(_ ipToValidate: String) -> Bool { @@ -289,14 +232,7 @@ class ServerProfile: NSObject, NSCopying { url.password = password url.port = Int(serverPort) - url.queryItems = [URLQueryItem(name: "Remark", value: remark), - URLQueryItem(name: "OTA", value: ota.description)] - if enabledKcptun { - url.queryItems?.append(contentsOf: [ - URLQueryItem(name: "Kcptun", value: enabledKcptun.description), - ]) - url.queryItems?.append(contentsOf: kcptunProfile.urlQueryItems()) - } + url.queryItems = [URLQueryItem(name: "Remark", value: remark)] let parts = url.string?.replacingOccurrences( of: "//", with: "", @@ -322,11 +258,7 @@ class ServerProfile: NSObject, NSCopying { } let userInfo = rawUserInfo.base64EncodedString() - var items = [URLQueryItem(name: "OTA", value: ota.description)] - if enabledKcptun { - items.append(URLQueryItem(name: "Kcptun", value: enabledKcptun.description)) - items.append(contentsOf: kcptunProfile.urlQueryItems()) - } + var items: [URLQueryItem] = [] if !plugin.isEmpty { let value = "\(plugin);\(pluginOptions)" items.append(URLQueryItem(name: "plugin", value: value)) diff --git a/ShadowsocksX-NG/ServerProfileManager.swift b/ShadowsocksX-NG/ServerProfileManager.swift index 8eb733c2..12636eaf 100644 --- a/ShadowsocksX-NG/ServerProfileManager.swift +++ b/ShadowsocksX-NG/ServerProfileManager.swift @@ -62,124 +62,4 @@ class ServerProfileManager: NSObject { return nil } } - - func importConfigFile() { - let openPanel = NSOpenPanel() - openPanel.title = "Choose Config Json File".localized - openPanel.allowsMultipleSelection = false - openPanel.canChooseDirectories = false - openPanel.canCreateDirectories = false - openPanel.canChooseFiles = true - openPanel.becomeKey() - let result = openPanel.runModal() - if (result.rawValue == NSFileHandlingPanelOKButton && (openPanel.url) != nil) { - let fileManager = FileManager.default - let filePath:String = (openPanel.url?.path)! - if (fileManager.fileExists(atPath: filePath) && filePath.hasSuffix("json")) { - let data = fileManager.contents(atPath: filePath) - let readString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)! - let readStringData = readString.data(using: String.Encoding.utf8.rawValue) - - let jsonArr1 = try! JSONSerialization.jsonObject(with: readStringData!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary - - for item in jsonArr1.object(forKey: "configs") as! [[String: AnyObject]]{ - let profile = ServerProfile() - profile.serverHost = item["server"] as! String - profile.serverPort = UInt16((item["server_port"]?.integerValue)!) - profile.method = item["method"] as! String - profile.password = item["password"] as! String - profile.remark = item["remarks"] as! String - - // Kcptun - profile.enabledKcptun = item["enabled_kcptun"]?.boolValue ?? false - if let kcptun = item["kcptun"] { - profile.kcptunProfile = KcptunProfile.fromDictionary(kcptun as! [String : Any?]) - } - - self.profiles.append(profile) - self.save() - } - NotificationCenter.default.post(name: NOTIFY_SERVER_PROFILES_CHANGED, object: nil) - let configsCount = (jsonArr1.object(forKey: "configs") as! [[String: AnyObject]]).count - let notification = NSUserNotification() - notification.title = "Import Server Profile succeed!".localized - notification.informativeText = "Successful import \(configsCount) items".localized - NSUserNotificationCenter.default - .deliver(notification) - }else{ - let notification = NSUserNotification() - notification.title = "Import Server Profile failed!".localized - notification.informativeText = "Invalid config file!".localized - NSUserNotificationCenter.default - .deliver(notification) - return - } - } - } - - func exportConfigFile() { - //读取example文件,删掉configs里面的配置,再用NSDictionary填充到configs里面 - let fileManager = FileManager.default - - let filePath:String = Bundle.main.path(forResource: "example-gui-config", ofType: "json")! - let data = fileManager.contents(atPath: filePath) - let readString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)! - let readStringData = readString.data(using: String.Encoding.utf8.rawValue) - let jsonArr1 = try! JSONSerialization.jsonObject(with: readStringData!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary - - let configsArray:NSMutableArray = [] //not using var? - - for profile in profiles{ - let configProfile:NSMutableDictionary = [:] //not using var? - //standard ss profile - configProfile.setValue(true, forKey: "enable") - configProfile.setValue(profile.serverHost, forKey: "server") - configProfile.setValue(NSNumber(value:profile.serverPort), forKey: "server_port")//not work - configProfile.setValue(profile.password, forKey: "password") - configProfile.setValue(profile.method, forKey: "method") - configProfile.setValue(profile.remark, forKey: "remarks") - configProfile.setValue(profile.remark.data(using: String.Encoding.utf8)?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0)), forKey: "remarks_base64") - - // Kcptun - configProfile.setValue(profile.enabledKcptun, forKey: "enabled_kcptun") - configProfile.setValue(profile.kcptunProfile.toDictionary(), forKey: "kcptun") - - configsArray.add(configProfile) - } - jsonArr1.setValue(configsArray, forKey: "configs") - let jsonData = try! JSONSerialization.data(withJSONObject: jsonArr1, options: JSONSerialization.WritingOptions.prettyPrinted) - let jsonString = NSString(data: jsonData, encoding: String.Encoding.utf8.rawValue)! as String - let savePanel = NSSavePanel() - savePanel.title = "Export Config Json File".localized - savePanel.canCreateDirectories = true - savePanel.allowedFileTypes = ["json"] - savePanel.nameFieldStringValue = "export.json" - savePanel.becomeKey() - let result = savePanel.runModal() - if (result.rawValue == NSFileHandlingPanelOKButton && (savePanel.url) != nil) { - //write jsonArr1 back to file - try! jsonString.write(toFile: (savePanel.url?.path)!, atomically: true, encoding: String.Encoding.utf8) - NSWorkspace.shared.selectFile((savePanel.url?.path)!, inFileViewerRootedAtPath: (savePanel.directoryURL?.path)!) - let notification = NSUserNotification() - notification.title = "Export Server Profile succeed!".localized - notification.informativeText = "Successful Export \(self.profiles.count) items".localized - NSUserNotificationCenter.default - .deliver(notification) - } - } - - class func showExampleConfigFile() { - //copy file to ~/Downloads folder - let filePath:String = Bundle.main.path(forResource: "example-gui-config", ofType: "json")! - let fileMgr = FileManager.default - let dataPath = NSHomeDirectory() + "/Downloads" - let destPath = dataPath + "/example-gui-config.json" - //检测文件是否已经存在,如果存在直接用sharedWorkspace显示 - if fileMgr.fileExists(atPath: destPath) { - NSWorkspace.shared.selectFile(destPath, inFileViewerRootedAtPath: dataPath) - }else{ - try! fileMgr.copyItem(atPath: filePath, toPath: destPath) - NSWorkspace.shared.selectFile(destPath, inFileViewerRootedAtPath: dataPath) - } - } } diff --git a/ShadowsocksX-NG/ShareServerProfilesWindowController.swift b/ShadowsocksX-NG/ShareServerProfilesWindowController.swift new file mode 100644 index 00000000..741ada1c --- /dev/null +++ b/ShadowsocksX-NG/ShareServerProfilesWindowController.swift @@ -0,0 +1,189 @@ +// +// ShareServerProfilesWindowController.swift +// ShadowsocksX-NG +// +// Created by 邱宇舟 on 2018/9/16. +// Copyright © 2018年 qiuyuzhou. All rights reserved. +// + +import Cocoa + +class ShareServerProfilesWindowController: NSWindowController + , NSTableViewDataSource, NSTableViewDelegate { + + @IBOutlet weak var profilesTableView: NSTableView! + + @IBOutlet weak var qrCodeImageView: NSImageView! + + @IBOutlet weak var copyAllServerURLsButton: NSButton! + @IBOutlet weak var saveAllServerURLsAsFileButton: NSButton! + + @IBOutlet weak var copyURLButton: NSButton! + @IBOutlet weak var copyQRCodeButton: NSButton! + @IBOutlet weak var saveQRCodeAsFileButton: NSButton! + + var defaults: UserDefaults! + var profileMgr: ServerProfileManager! + + override func windowDidLoad() { + super.windowDidLoad() + + defaults = UserDefaults.standard + profileMgr = ServerProfileManager.instance + + if !profileMgr.profiles.isEmpty { + let index = IndexSet(integer: 0) + profilesTableView.selectRowIndexes(index, byExtendingSelection: false) + } else { + copyAllServerURLsButton.isEnabled = false + saveAllServerURLsAsFileButton.isEnabled = false + copyURLButton.isEnabled = false + copyQRCodeButton.isEnabled = false + saveQRCodeAsFileButton.isEnabled = false + } + } + + @IBAction func copyURL(_ sender: NSButton) { + let profile = getSelectedProfile() + if profile.isValid(), let url = profile.URL() { + let pb = NSPasteboard.general + pb.clearContents() + if pb.writeObjects([url as NSPasteboardWriting]) { + NSLog("Copy URL to clipboard") + } else { + NSLog("Failed to copy URL to clipboard") + } + } + } + + @IBAction func copyQRCode(_ sender: NSButton) { + if let img = qrCodeImageView.image { + let pb = NSPasteboard.general + pb.clearContents() + if pb.writeObjects([img as NSPasteboardWriting]) { + NSLog("Copy QRCode to clipboard") + } else { + NSLog("Failed to copy QRCode to clipboard") + } + } + } + + @IBAction func saveQRCodeAsFile(_ sender: NSButton) { + if let img = qrCodeImageView.image { + let savePanel = NSSavePanel() + savePanel.title = "Save All Server URLs To File".localized + savePanel.canCreateDirectories = true + savePanel.allowedFileTypes = ["gif"] + savePanel.isExtensionHidden = false + + let profile = getSelectedProfile() + if profile.remark.isEmpty { + savePanel.nameFieldStringValue = "shadowsocks_qrcode.gif" + } else { + savePanel.nameFieldStringValue = "shadowsocks_qrcode_\(profile.remark).gif" + } + + savePanel.becomeKey() + let result = savePanel.runModal() + if (result.rawValue == NSFileHandlingPanelOKButton && (savePanel.url) != nil) { + let imgRep = NSBitmapImageRep(data: img.tiffRepresentation!) + let data = imgRep?.representation(using: NSBitmapImageRep.FileType.gif, properties: [:]) + try! data?.write(to: savePanel.url!) + } + } + } + + @IBAction func copyAllServerURLs(_ sender: NSButton) { + let pb = NSPasteboard.general + pb.clearContents() + if pb.writeObjects([getAllServerURLs() as NSPasteboardWriting]) { + NSLog("Copy all server URLs to clipboard") + } else { + NSLog("Failed to all server URLs to clipboard") + } + } + + @IBAction func saveAllServerURLsAsFile(_ sender: NSButton) { + let formatter = DateFormatter() + formatter.dateFormat = "yyyyMMdd" + let date_string = formatter.string(from: Date()) + + let savePanel = NSSavePanel() + savePanel.title = "Save All Server URLs To File".localized + savePanel.canCreateDirectories = true + savePanel.allowedFileTypes = ["txt"] + savePanel.isExtensionHidden = false + savePanel.nameFieldStringValue = "shadowsocks_profiles_\(date_string).txt" + savePanel.becomeKey() + let result = savePanel.runModal() + if (result.rawValue == NSFileHandlingPanelOKButton && (savePanel.url) != nil) { + let urls = getAllServerURLs() + try! urls.write(to: (savePanel.url)!, atomically: true, encoding: String.Encoding.utf8) + } + } + + func getAllServerURLs() -> String { + let urls = profileMgr.profiles.filter({ (profile) -> Bool in + return profile.isValid() + }).map { (profile) -> String in + return profile.URL()!.absoluteString + } + return urls.joined(separator: "\n") + } + + func getSelectedProfile() -> ServerProfile { + let i = profilesTableView.selectedRow + return profileMgr.profiles[i] + } + + func getDataAtRow(_ index:Int) -> String { + let profile = profileMgr.profiles[index] + if !profile.remark.isEmpty { + return profile.remark + } else { + return profile.serverHost + } + } + + //-------------------------------------------------- + // For NSTableViewDataSource + + func numberOfRows(in tableView: NSTableView) -> Int { + if let mgr = profileMgr { + return mgr.profiles.count + } + return 0 + } + + //-------------------------------------------------- + // For NSTableViewDelegate + + func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { + let colId = NSUserInterfaceItemIdentifier(rawValue: "cellTitle") + if let cell = tableView.makeView(withIdentifier: colId, owner: self) as? NSTableCellView { + cell.textField?.stringValue = getDataAtRow(row) + return cell + } + return nil + } + + func tableViewSelectionDidChange(_ notification: Notification) { + if profilesTableView.selectedRow >= 0 { + let profile = getSelectedProfile() + if profile.isValid(), let url = profile.URL() { + let img = createQRImage(url.absoluteString, NSMakeSize(250, 250)) + qrCodeImageView.image = img + + copyURLButton.isEnabled = true + copyQRCodeButton.isEnabled = true + saveQRCodeAsFileButton.isEnabled = true + return + } + } + qrCodeImageView.image = nil + + copyURLButton.isEnabled = false + copyQRCodeButton.isEnabled = false + saveQRCodeAsFileButton.isEnabled = false + } +} diff --git a/ShadowsocksX-NG/Utils.h b/ShadowsocksX-NG/Utils.h index 9e9110f2..9c30936e 100644 --- a/ShadowsocksX-NG/Utils.h +++ b/ShadowsocksX-NG/Utils.h @@ -11,4 +11,6 @@ void ScanQRCodeOnScreen(); +NSImage* createQRImage(NSString *string, NSSize size); + #endif /* QRCodeUtils_h */ diff --git a/ShadowsocksX-NG/Utils.m b/ShadowsocksX-NG/Utils.m index 92912c9d..c5a62928 100644 --- a/ShadowsocksX-NG/Utils.m +++ b/ShadowsocksX-NG/Utils.m @@ -8,6 +8,7 @@ #import #import +#import void ScanQRCodeOnScreen() { /* displays[] Quartz display ID's */ @@ -75,3 +76,42 @@ void ScanQRCodeOnScreen() { } ]; } + +NSImage* createQRImage(NSString *string, NSSize size) { + NSImage *outputImage = [[NSImage alloc]initWithSize:size]; + [outputImage lockFocus]; + + // Setup the QR filter with our string + CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; + [filter setDefaults]; + + NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; + [filter setValue:data forKey:@"inputMessage"]; + /* + L: 7% + M: 15% + Q: 25% + H: 30% + */ + [filter setValue:@"Q" forKey:@"inputCorrectionLevel"]; + + CIImage *image = [filter valueForKey:@"outputImage"]; + + // Calculate the size of the generated image and the scale for the desired image size + CGRect extent = CGRectIntegral(image.extent); + CGFloat scale = MIN(size.width / CGRectGetWidth(extent), size.height / CGRectGetHeight(extent)); + + CGImageRef bitmapImage = [NSGraphicsContext.currentContext.CIContext createCGImage:image fromRect:extent]; + + CGContextRef graphicsContext = NSGraphicsContext.currentContext.CGContext; + + CGContextSetInterpolationQuality(graphicsContext, kCGInterpolationNone); + CGContextScaleCTM(graphicsContext, scale, scale); + CGContextDrawImage(graphicsContext, extent, bitmapImage); + + // Cleanup + CGImageRelease(bitmapImage); + + [outputImage unlockFocus]; + return outputImage; +} diff --git a/ShadowsocksX-NG/gfwlist.txt b/ShadowsocksX-NG/gfwlist.txt index 40f8e76c..d0231c08 100644 --- a/ShadowsocksX-NG/gfwlist.txt +++ b/ShadowsocksX-NG/gfwlist.txt @@ -1,1456 +1,1929 @@ -W0F1dG9Qcm94eSAwLjIuOV0KISBDaGVja3N1bTogYXhoVllDYUNhdmNzblhsSStQ -RWwydwohIEV4cGlyZXM6IDZoCiEgVGl0bGU6IEdGV0xpc3Q0TEwKISBHRldMaXN0 -IHdpdGggRVZFUllUSElORyBpbmNsdWRlZAohIExhc3QgTW9kaWZpZWQ6IFRodSwg -MTIgSmFuIDIwMTcgMDk6MDU6NTcgKzAxMDAKIQohIEhvbWVQYWdlOiBodHRwczov -L2dpdGh1Yi5jb20vZ2Z3bGlzdC9nZndsaXN0CiEgTGljZW5zZTogaHR0cHM6Ly9y -YXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2dmd2xpc3QvZ2Z3bGlzdC9tYXN0ZXIv -Q09QWUlORy50eHQKIQohIEdGV0xpc3QgaXMgdW5saWtlbHkgdG8gZnVsbHkgY29t -cHJpc2UgdGhlIHJlYWwKISBydWxlcyBiZWluZyBkZXBsb3llZCBpbnNpZGUgR0ZX -IHN5c3RlbS4gV2UgdHJ5CiEgb3VyIGJlc3QgdG8ga2VlcCB0aGUgbGlzdCB1cCB0 -byBkYXRlLiBQbGVhc2UKISBjb250YWN0IHVzIHJlZ2FyZGluZyBVUkwgc3VibWlz -c2lvbiAvIHJlbW92YWwsCiEgb3Igc3VnZ2VzdGlvbiAvIGVuaGFuY2VtZW50IGF0 -IGlzc3VlIHRyYWNrZXI6CiEgaHR0cHM6Ly9naXRodWIuY29tL2dmd2xpc3QvZ2Z3 -bGlzdC9pc3N1ZXMvLgoKIS0tLS0tLS0tLTQwMy80NTEvNTIwICYgVVJMIFJlZGly -ZWN0cy0tLS0tLS0tLQp8fDR0ZXJuLmNvbQohLS1laGVudGFpCnxodHRwOi8vODUu -MTcuNzMuMzEvCnx8YWRvcmFtYS5jb20KfHxhZ25lc2IuZnIKfHxha2liYS13ZWIu -Y29tCnx8YWxpZW4tdWZvcy5jb20KfHxhbHRyZWMuY29tCnx8YXJlbmEudGFpcGVp -Cnx8YXNpYW5zcGlzcy5jb20KfHxhdGhlbmFlaXpvdS5jb20KfHxhenVidS50dgp8 -fGJhcnJhY3VkYS5jb20KfHxiZWVnLmNvbQp8fGJsb29tYmVyZ3ZpZXcuY29tCnx8 -Ym95c21hc3Rlci5jb20KfHxjYXJmYXguY29tCi5jYXNpbm9iZWxsaW5pLmNvbQp8 -fGNhc2lub2JlbGxpbmkuY29tCnx8Y2VudGF1cm8uY29tLmJyCnx8aW1hZ2VzLmNv -bWljby50dwp8fHN0YXRpYy5jb21pY28udHcKfHxjcm9zc2ZpcmUuY28ua3IKfHxk -YXJwYS5taWwKfHxkZXNpcHJvLmRlCnx8ZGlzaC5jb20KfGh0dHA6Ly9pbWcuZGxz -aXRlLmpwLwohLS18fHNoYXJlLmRtaHkub3JnCnx8ZG1tLmNvLmpwCnxodHRwOi8v -d3d3LmRtbS5jb20vbmV0Z2FtZQp8fGVlc3RpLmVlCi5leHBla3QuY29tCnx8ZXhw -ZWt0LmNvbQouZXh0bWF0cml4LmNvbQp8fGV4dG1hdHJpeC5jb20KfHxmYWtrdS5u -ZXQKfHxmYXN0cGljLnJ1Cnx8ZmlsZXNvci5jb20KfHxmaW5hbmNldHdpdHRlci5j -b20KfHxmaW5kbWltYS5jb20KfHxmbGlwYm9hcmQuY29tCnx8ZmxpdHRvLmNvbQp8 -fGZ1bmt5aW1nLmNvbQp8fGZ4bmV0d29ya3MuY29tCnx8Z2V0dHlpbWFnZXMuY29t -Cnx8Z2V0dXBsb2FkZXIuY29tCnxodHRwczovL2dpdGh1Yi5jb20vcHJvZ3JhbXRo -aW5rL3poYW8KfHxnbGFzczguZXUKfHxnbHlwZS5jb20KfHxnbzE0MS5jb20KfHxo -YXV0ZWxvb2suY29tCnx8aGF1dGVsb29rY2RuLmNvbQp8fGhtdmRpZ2l0YWwuY2EK -fHxobXZkaWdpdGFsLmNvbQp8fGhvbWVkZXBvdC5jb20KfHxob292ZXJzLmNvbQp8 -fGh1bHUuY29tCnx8aHVsdWltLmNvbQp8aHR0cDovL3NlY3VyZS5odXN0bGVyLmNv -bQp8aHR0cDovL2h1c3RsZXJjYXNoLmNvbQp8aHR0cDovL3d3dy5odXN0bGVyY2Fz -aC5jb20KfHxoeWJyaWQtYW5hbHlzaXMuY29tCnx8Y2RuKi5pLXNjbXAuY29tCnx8 -aWxvdmVsb25ndG9lcy5jb20KfGh0dHA6Ly9pbWdtZWdhLmNvbS8qLmdpZi5odG1s -CnxodHRwOi8vaW1nbWVnYS5jb20vKi5qcGcuaHRtbAp8aHR0cDovL2ltZ21lZ2Eu -Y29tLyouanBlZy5odG1sCnxodHRwOi8vaW1nbWVnYS5jb20vKi5wbmcuaHRtbAp8 -aHR0cDovL2ltZ3VyLmNvbS91cGxvYWQKfHxqYXZodWIubmV0Cnx8amF2aHVnZS5j -b20KLmphdmxpYnJhcnkuY29tCnx8amF2bGlicmFyeS5jb20KfHxqY3Blbm5leS5j -b20KfHxqdWxpZXBvc3QuY29tCnx8a2F3YWlpa2F3YWlpLmpwCnx8a2hhdHJpbWF6 -YS5vcmcKfHxsZWlzdXJlcHJvLmNvbQp8fGxvbmd0b2VzLmNvbQp8fGxvdmV0dnNo -b3cuY29tCnxodHRwOi8vd3d3Lm0tc3BvcnQuY28udWsKfHxtYWNnYW1lc3RvcmUu -Y29tCnx8bWFkb25uYS1hdi5jb20KfHxtYW5nYWZveC5jb20KfHxtYW5nYWZveC5t -ZQp8fG1hdG9tZS1wbHVzLmNvbQp8fG1hdG9tZS1wbHVzLm5ldAp8fG1hdHR3aWxj -b3gubmV0Cnx8bWV0YXJ0aHVudGVyLmNvbQp8fG1meG1lZGlhLmNvbQp8fGtiLm1v -bml0b3J3YXJlLmNvbQp8fG1vbnN0ZXIuY29tCnx8bW9vZHl6LmNvbQp8fG11enUu -dHYKfHxtdmcuanAKfHxuYXRpb253aWRlLmNvbQp8aHR0cDovL3d3dy5uYmMuY29t -L2xpdmUKfHxuZXRmbGl4LmNvbQp8aHR0cDovL21vLm5pZ2h0bGlmZTE0MS5jb20K -fHxub3Jkc3Ryb20uY29tCnx8bm9yZHN0cm9taW1hZ2UuY29tCnx8bm9yZHN0cm9t -cmFjay5jb20KfHxub3R0aW5naGFtcG9zdC5jb20KfHxudGR0di5jegp8fHMxLm51 -ZGV6ei5jb20KfHxudXNhdHJpcC5jb20KfHxudXV2ZW0uY29tCnx8b21uaTcuanAK -IS0tV2UgYXJlIGNvbmZ1c2VkIGFzIHdlbGwKfHxvbnRyYWMuY29tCkBAfGh0dHA6 -Ly9ibG9nLm9udHJhYy5jb20KfHxwYW5kb3JhLmNvbQoucGFuZG9yYS50dgp8fHBh -cmthbnNreS5jb20KfGh0dHA6Ly8qLnBpbWcudHcvCnx8cHVyZTE4LmNvbQp8fHFx -LmNvLnphCnx8cjE4LmNvbQp8aHR0cDovL3JhZGlrby5qcAp8fHJkLmNvbQp8fHJk -aW8uY29tCnx8c2FkaXN0aWMtdi5jb20KfGh0dHA6Ly9jZG4qLnNlYXJjaC54eHgv -Cnx8c2h1dHRlcnN0b2NrLmNvbQp8fHNsYWNrZXIuY29tCnx8c3BvdGlmeS5jb20K -fHxzcHJpbmdib2FyZHBsYXRmb3JtLmNvbQp8fHNwcml0ZS5vcmcKQEB8aHR0cDov -L3N0b3JlLnNwcml0ZS5vcmcKfHxzdXBlcnBhZ2VzLmNvbQp8fHN3YWdidWNrcy5j -b20KfHxzd2l0Y2gxLmpwCnx8dGFwYW53YXAuY29tCnx8dGFyZ2V0LmNvbQpAQHx8 -aW50bC50YXJnZXQuY29tCnx8dG1hLmNvLmpwCnx8dHVybnRhYmxlLmZtCnx8dHdl -cmtpbmdidXR0LmNvbQp8fHZlZ2FzcmVkLmNvbQp8fHZldm8uY29tCnxodHRwOi8v -dml1LnR2L2NoLwp8aHR0cDovL3ZpdS50di9lbmNvcmUvCnxodHRwOi8vZWNzbS52 -cy5jb20vCnx8d2Fuei1mYWN0b3J5LmNvbQp8fHdoZXJldG93YXRjaC5jb20KfHx3 -aW5nYW1lc3RvcmUuY29tCnx8d2l6Y3JhZnRzLm5ldAp8fHhmaW5pdHkuY29tCnx8 -eXRuLmNvLmtyCnx8emF0dG9vLmNvbQp8fHpvem90b3duLmNvbQoKISMjIyMjIyMj -IyMjIyMjR2VuZXJhbCBMaXN0IFN0YXJ0IyMjIyMjIyMjIyMjIyMjCiEtLS0tLS0t -LS0tLS0tLS0tLS0tUHVyZSBJUC0tLS0tLS0tLS0tLS0tLS0tLS0tLQo1MC43LjMx -LjIzMDo4ODk4CjE3NC4xNDIuMTA1LjE1Mwo2OS42NS4xOS4xNjAKCiEtLS0tLS0t -LS0tLS0tTm9uLUxhdGluIERvbWFpbiBOYW1lcy0tLS0tLS0tLS0tLQp8fHhuLS00 -Z3ExNzFwLmNvbQp8fHhuLS1wOGo5YTBkOWM5YS54bi0tcTlqeWI0YwoKIS0tLS0t -LS0tLS0tLS0tLS1GcmF1ZHMgJiBTY2Ftcy0tLS0tLS0tLS0tLS0tLS0tCmNoaW5h -LW1tbS5qcC5uZXQKLmxzeHN6emcuY29tCi5jaGluYS1tbW0ubmV0Cnx8Y2hpbmEt -bW1tLm5ldApjaGluYS1tbW0uc2EuY29tCgohLS0tLS0tLS0tLS0tLS0tLS0tLS0t -R3JvdXBzLS0tLS0tLS0tLS0tLS0tLS0tLS0KISEtLS1BbWF6b24tLS0KLmFtYXpv -bi5jb20vRGFsYWktTGFtYQpzMy1hcC1ub3J0aGVhc3QtMS5hbWF6b25hd3MuY29t -CgohIS0tLUF2TW9vLS0tCi5hdm1vLnB3CiEtLXxodHRwOi8vYXZtby5wdwouYXZt -b28uY29tCnxodHRwOi8vYXZtb28uY29tCi5hdm1vby5uZXQKfGh0dHA6Ly9hdm1v -by5uZXQKfHxhdm1vby5wdwouamF2bW9vLnh5egp8aHR0cDovL2phdm1vby54eXoK -LmphdnRhZy5jb20KfGh0dHA6Ly9qYXZ0YWcuY29tCi5qYXZ6b28uY29tCnxodHRw -Oi8vamF2em9vLmNvbQoKISEtLS1DaGFuZ2VJUC0tLQouMWR1bWIuY29tCi4yNXUu -Y29tCi4yd2FreS5jb20KLjMtYS5uZXQKLjRkcS5jb20KLjRteWRvbWFpbi5jb20K -LjRwdS5jb20KLmFjbWV0b3kuY29tCi5hbG1vc3RteS5jb20KLmFtZXJpY2FudW5m -aW5pc2hlZC5jb20KLmF1dGhvcml6ZWRkbnMubmV0Ci5hdXRob3JpemVkZG5zLm9y -ZwouYXV0aG9yaXplZGRucy51cwouYmlnbW9uZXkuYml6Ci5jaGFuZ2VpcC5uYW1l -Ci5jaGFuZ2VpcC5uZXQKLmNoYW5nZWlwLm9yZwouY2xlYW5zaXRlLmJpegouY2xl -YW5zaXRlLmluZm8KLmNsZWFuc2l0ZS51cwouY29tcHJlc3MudG8KLmRkbnMuaW5m -bwouZGRucy5tZS51awouZGRucy5tb2JpCi5kZG5zLm1zCi5kZG5zLm5hbWUKLmRk -bnMudXMKLmRoY3AuYml6Ci5kbnMtZG5zLmNvbQouZG5zLXN0dWZmLmNvbQouZG5z -MDQuY29tCi5kbnMwNS5jb20KLmRuczEudXMKLmRuczIudXMKLmRuc2V0LmNvbQou -ZG5zcmQuY29tCi5kc210cC5jb20KLmR1bWIxLmNvbQouZHluYW1pYy1kbnMubmV0 -Ci5keW5hbWljZG5zLmJpegouZHluYW1pY2Rucy5jby51awouZHluYW1pY2Rucy5t -ZS51awouZHluYW1pY2Rucy5vcmcudWsKLmR5bmRucy5wcm8KLmR5bnNzbC5jb20K -LmVkbnMuYml6Ci5lcGFjLnRvCi5lc210cC5iaXoKLmV6dWEuY29tCi5mYXFzZXJ2 -LmNvbQouZmFydGl0LmNvbQouZnJlZWRkbnMuY29tCi5mcmVldGNwLmNvbQouZnJl -ZXd3dy5iaXoKLmZyZWV3d3cuaW5mbwouZnRwMS5iaXoKLmZ0cHNlcnZlci5iaXoK -LmdldHRyaWFscy5jb20KLmdvdC1nYW1lLm9yZwouZ3I4ZG9tYWluLmJpegouZ3I4 -bmFtZS5iaXoKLmh0dHBzNDQzLm5ldAouaHR0cHM0NDMub3JnCi5pa3diLmNvbQou -aW5zdGFudGhxLmNvbQouaW93bnlvdXIuYml6Ci5pb3dueW91ci5vcmcKLmlzYXNl -Y3JldC5jb20KLml0ZW1kYi5jb20KLml0c2FvbC5jb20KLmpldG9zLmNvbQouamt1 -Yi5jb20KLmp1bmdsZWhlYXJ0LmNvbQouanVzdGRpZWQuY29tCi5sZmxpbmsuY29t -Ci5sZmxpbmt1cC5jb20KLmxmbGlua3VwLm5ldAoubGZsaW5rdXAub3JnCi5sb25n -bXVzaWMuY29tCi5tZWZvdW5kLmNvbQoubW9uZXlob21lLmJpegoubXJiYXNpYy5j -b20KLm1yYm9udXMuY29tCi5tcmZhY2UuY29tCi5tcnNsb3ZlLmNvbQoubXkwMy5j -b20KLm15ZGFkLmluZm8KLm15ZGRucy5jb20KLm15ZnRwLmluZm8KLm15ZnRwLm5h -bWUKLm15bGZ0di5jb20KLm15bW9tLmluZm8KLm15bmV0YXYubmV0Ci5teW5ldGF2 -Lm9yZwoubXludW1iZXIub3JnCi5teXBpY3R1cmUuaW5mbwoubXlwb3AzLm5ldAou -bXlwb3AzLm9yZwoubXlzZWNvbmRhcnlkbnMuY29tCi5teXd3dy5iaXoKLm15ei5p -bmZvCi5uaW50aC5iaXoKLm5zMDEuYml6Ci5uczAxLmluZm8KLm5zMDEudXMKLm5z -MDIuYml6Ci5uczAyLmluZm8KLm5zMDIudXMKLm5zMS5uYW1lCi5uczIubmFtZQou -bnMzLm5hbWUKLm9jcnkuY29tCi5vbmVkdW1iLmNvbQoub25teXBjLmJpegoub25t -eXBjLmluZm8KLm9ubXlwYy5uZXQKLm9ubXlwYy5vcmcKLm9ubXlwYy51cwoub3Jn -YW5pY2NyYXAuY29tCi5vdHpvLmNvbQoub3VyaG9iYnkuY29tCi5wY2FueXdoZXJl -Lm5ldAoucG9ydDI1LmJpegoucHJveHlkbnMuY29tCi5xaGlnaC5jb20KLnFwb2Uu -Y29tCi5yZWJhdGVzcnVsZS5uZXQKLnNlbGxjbGFzc2ljcy5jb20KLnNlbmRzbXRw -LmNvbQouc2VydmV1c2VyLmNvbQouc2VydmV1c2Vycy5jb20KLnNleGlkdWRlLmNv -bQouc2V4eHh5LmJpegouc2l4dGguYml6Ci5zcXVpcmx5LmluZm8KLnNzbDQ0My5v -cmcKLnRvaC5pbmZvCi50b3l0aGlldmVzLmNvbQoudHJpY2tpcC5uZXQKLnRyaWNr -aXAub3JnCi52aXp2YXouY29tCi53aGEubGEKLndpa2FiYS5jb20KLnd3dzEuYml6 -Ci53d3dob3N0LmJpegpAQHxodHRwOi8veHgud3d3aG9zdC5iaXoKLngyNGhyLmNv -bQoueHh1ei5jb20KLnh4eHkuYml6Ci54eHh5LmluZm8KLnlndG8uY29tCi55b3Vk -b250Y2FyZS5jb20KLnlvdXJ0cmFwLmNvbQouenlucy5jb20KLnp6dXguY29tCgoh -IS0tLUNsb3VkRnJvbnQtLS0KZDFiMTgzc2cwbnZudWguY2xvdWRmcm9udC5uZXQK -fGh0dHBzOi8vZDFiMTgzc2cwbnZudWguY2xvdWRmcm9udC5uZXQKZDFjMzdnandh -MjZ0YWEuY2xvdWRmcm9udC5uZXQKfGh0dHBzOi8vZDFjMzdnandhMjZ0YWEuY2xv -dWRmcm9udC5uZXQKfHxkM3JocjdrZ210cnExdi5jbG91ZGZyb250Lm5ldAoKISEt -LS1EdEROUy0tLQouM2QtZ2FtZS5jb20KLjRpcmMuY29tCi5iMG5lLmNvbQouY2hh -dG5vb2suY29tCi5kYXJrdGVjaC5vcmcKLmRlYWZ0b25lLmNvbQouZHRkbnMubmV0 -Ci5lZmZlcnMuY29tCi5ldG93bnMubmV0Ci5ldG93bnMub3JnCi5mbG5ldC5vcmcK -LmdvdGdlZWtzLmNvbQouc2NpZXJvbi5jb20KLnNseWlwLmNvbQouc2x5aXAubmV0 -Ci5zdXJvb3QuY29tCgohIS0tLUZhY2Vib29rLS0tCnx8ZmFjZWJvb2suYnIKLmZh -Y2Vib29rLmNvbQp8fGZhY2Vib29rLmNvbQohLS0vXmh0dHBzPzpcL1wvW15cL10r -ZmFjZWJvb2tcLmNvbS8KQEB8fCp2Ni5mYWNlYm9vay5jb20KfHxmYWNlYm9vay5k +W0F1dG9Qcm94eSAwLjIuOV0KISBDaGVja3N1bTogYWltMGM0RTNJdEIyTzZvMnhY +UUJSdwohIEV4cGlyZXM6IDZoCiEgVGl0bGU6IEdGV0xpc3Q0TEwKISBHRldMaXN0 +IHdpdGggRVZFUllUSElORyBpbmNsdWRlZAohIExhc3QgTW9kaWZpZWQ6IFR1ZSwg +MjQgQXByIDIwMTggMDk6NDQ6NDAgLTA0MDAKIQohIEhvbWVQYWdlOiBodHRwczov +L2dpdGh1Yi5jb20vZ2Z3bGlzdC9nZndsaXN0CiEgTGljZW5zZTogaHR0cHM6Ly93 +d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CiEK +ISBHRldMaXN0IGlzIHVubGlrZWx5IHRvIGZ1bGx5IGNvbXByaXNlIHRoZSByZWFs +CiEgcnVsZXMgYmVpbmcgZGVwbG95ZWQgaW5zaWRlIEdGVyBzeXN0ZW0uIFdlIHRy +eQohIG91ciBiZXN0IHRvIGtlZXAgdGhlIGxpc3QgdXAgdG8gZGF0ZS4gUGxlYXNl +CiEgY29udGFjdCB1cyByZWdhcmRpbmcgVVJMIHN1Ym1pc3Npb24gLyByZW1vdmFs +LAohIG9yIHN1Z2dlc3Rpb24gLyBlbmhhbmNlbWVudCBhdCBpc3N1ZSB0cmFja2Vy +OgohIGh0dHBzOi8vZ2l0aHViLmNvbS9nZndsaXN0L2dmd2xpc3QvaXNzdWVzLy4K +CiEtLS0tLS0tLS00MDMvNDUxLzUyMCAmIFVSTCBSZWRpcmVjdHMtLS0tLS0tLS0K +fHwyZGJvb2suY29tCnx8NHRlcm4uY29tCiEtLWVoZW50YWkKfGh0dHA6Ly84NS4x +Ny43My4zMS8KfHxhZG9yYW1hLmNvbQp8fGFnbmVzYi5mcgp8fGFraWJhLXdlYi5j +b20KfHxhbGllbi11Zm9zLmNvbQp8fGFsdHJlYy5jb20KfHxhcGFydG1lbnRzLmNv +bQp8fGFyZW5hLnRhaXBlaQp8fGFzaWFuc3Bpc3MuY29tCnx8YXNzaW1wLm9yZwp8 +fGF0aGVuYWVpem91LmNvbQp8fGF6dWJ1LnR2Cnx8YmFub3J0ZS5jb20KfHxiYXNo +LWhhY2tlcnMub3JnCnx8YmVlZy5jb20KfHxnbG9iYWwuYmluZy5jb20KfHxibG9v +bWJlcmd2aWV3LmNvbQp8fGJveXNtYXN0ZXIuY29tCnx8YnluZXQuY28uaWwKfHxj +YXJmYXguY29tCi5jYXNpbm9iZWxsaW5pLmNvbQp8fGNhc2lub2JlbGxpbmkuY29t +Cnx8Y2VudGF1cm8uY29tLmJyCnx8aW1hZ2VzLmNvbWljby50dwp8fHN0YXRpYy5j +b21pY28udHcKfHxjcm9zc2ZpcmUuY28ua3IKfHxkMnBhc3MuY29tCnx8ZGFycGEu +bWlsCnx8ZGF3YW5naWRjLmNvbQp8fGRlZXplci5jb20KfHxkZXNpcHJvLmRlCnx8 +ZGluZ2NoaW4uY29tLnR3Cnx8ZGlzaC5jb20KfGh0dHA6Ly9pbWcuZGxzaXRlLmpw +Lwp8fGRtNTMwLm5ldApzaGFyZS5kbWh5Lm9yZwpAQHxodHRwczovL3NoYXJlLmRt +aHkub3JnCnx8ZG1tLmNvLmpwCnxodHRwOi8vd3d3LmRtbS5jb20vbmV0Z2FtZQp8 +fGRudm9kLnR2Cnx8ZWVzdGkuZWUKLmV4cGVrdC5jb20KfHxleHBla3QuY29tCi5l +eHRtYXRyaXguY29tCnx8ZXh0bWF0cml4LmNvbQp8fGZha2t1Lm5ldAp8fGZhc3Rw +aWMucnUKfHxmaWxlc29yLmNvbQp8fGZpbmFuY2V0d2l0dGVyLmNvbQp8fGZsaXBi +b2FyZC5jb20KfHxmbGl0dG8uY29tCnx8ZnVua3lpbWcuY29tCnx8ZnhuZXR3b3Jr +cy5jb20KfHxnLWFyZWEub3JnCnx8Z2V0dHlpbWFnZXMuY29tCnx8Z2V0dXBsb2Fk +ZXIuY29tCiEtLXxodHRwczovL2dpdGh1Yi5jb20vcHJvZ3JhbXRoaW5rL3poYW8K +fGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9wcm9ncmFtdGhpbmsv +emhhbwp8fGdsYXNzOC5ldQp8fGdseXBlLmNvbQp8fGdvMTQxLmNvbQp8fGd1by5t +ZWRpYQp8fGhhdXRlbG9vay5jb20KfHxoYXV0ZWxvb2tjZG4uY29tCnx8aG12ZGln +aXRhbC5jYQp8fGhtdmRpZ2l0YWwuY29tCnx8aG9tZWRlcG90LmNvbQp8fGhvb3Zl +cnMuY29tCnx8aHVsdS5jb20KfHxodWx1aW0uY29tCnxodHRwOi8vc2VjdXJlLmh1 +c3RsZXIuY29tCnxodHRwOi8vaHVzdGxlcmNhc2guY29tCnxodHRwOi8vd3d3Lmh1 +c3RsZXJjYXNoLmNvbQp8fGh5YnJpZC1hbmFseXNpcy5jb20KfHxjZG4qLmktc2Nt +cC5jb20KfHxpbG92ZWxvbmd0b2VzLmNvbQp8aHR0cDovL2ltZ21lZ2EuY29tLyou +Z2lmLmh0bWwKfGh0dHA6Ly9pbWdtZWdhLmNvbS8qLmpwZy5odG1sCnxodHRwOi8v +aW1nbWVnYS5jb20vKi5qcGVnLmh0bWwKfGh0dHA6Ly9pbWdtZWdhLmNvbS8qLnBu +Zy5odG1sCnxodHRwOi8vaW1ndXIuY29tL3VwbG9hZAp8aHR0cHM6Ly9pbWd1ci5j +b20vdXBsb2FkCnx8aW1saXZlLmNvbQp8fGphdmh1Yi5uZXQKfHxqYXZodWdlLmNv +bQouamF2bGlicmFyeS5jb20KfHxqYXZsaWJyYXJ5LmNvbQp8fGpjcGVubmV5LmNv +bQp8fGppbXMubmV0Cnx8anVrdWpvLWNsdWIuY29tCnx8anVsaWVwb3N0LmNvbQp8 +fGthd2FpaWthd2FpaS5qcAp8fGtlbmRhdGlyZS5jb20KfHxraGF0cmltYXphLm9y +Zwp8fGtrYm94LmNvbQp8fGxlaXN1cmVwcm8uY29tCnx8bGlmZW1pbGVzLmNvbQp8 +fGxvbmd0b2VzLmNvbQp8fGxvdmV0dnNob3cuY29tCnxodHRwOi8vd3d3Lm0tc3Bv +cnQuY28udWsKfHxtYWNnYW1lc3RvcmUuY29tCnx8bWFkb25uYS1hdi5jb20KfHxt +YW5nYWZveC5jb20KfHxtYW5nYWZveC5tZQp8fG1hbnRhLmNvbQp8fG1hdG9tZS1w +bHVzLmNvbQp8fG1hdG9tZS1wbHVzLm5ldAp8fG1hdHR3aWxjb3gubmV0Cnx8bWV0 +YXJ0aHVudGVyLmNvbQp8fG1meG1lZGlhLmNvbQp8fGtiLm1vbml0b3J3YXJlLmNv +bQp8fG1vbnN0ZXIuY29tCnx8bW9vZHl6LmNvbQp8fG1vcy5ydQp8fG1zaGEuZ292 +Cnx8bXV6dS50dgp8fG12Zy5qcAoubXliZXQuY29tCnx8bXliZXQuY29tCnx8bmF0 +aW9ud2lkZS5jb20KfGh0dHA6Ly93d3cubmJjLmNvbS9saXZlCnx8bmVvLW1pcmFj +bGUuY29tCnx8bmV0ZmxpeC5jb20KfHxuZmx4aW1nLmNvbQp8fG5mbHhpbWcubmV0 +Cnx8bmZseGV4dC5jb20KfHxuZmx4c28ubmV0Cnx8bmZseHZpZGVvLm5ldAp8fG5p +Yy5nb3YKfGh0dHA6Ly9tby5uaWdodGxpZmUxNDEuY29tCnx8bm9yZHN0cm9tLmNv +bQp8fG5vcmRzdHJvbWltYWdlLmNvbQp8fG5vcmRzdHJvbXJhY2suY29tCnx8bm90 +dGluZ2hhbXBvc3QuY29tCnx8bnRkdHYuY3oKfHxzMS5udWRlenouY29tCnx8bnVz +YXRyaXAuY29tCnx8bnV1dmVtLmNvbQp8fG9tbmk3LmpwCnx8b25hcHAuY29tCiEt +LVdlIGFyZSBjb25mdXNlZCBhcyB3ZWxsCnx8b250cmFjLmNvbQpAQHxodHRwOi8v +YmxvZy5vbnRyYWMuY29tCnx8cGFuZG9yYS5jb20KLnBhbmRvcmEudHYKfHxwYXJr +YW5za3kuY29tCnx8cGhtc29jaWV0eS5vcmcKfGh0dHA6Ly8qLnBpbWcudHcvCnx8 +cHVyZTE4LmNvbQp8fHFxLmNvLnphCnx8cjE4LmNvbQp8aHR0cDovL3JhZGlrby5q +cAp8fHJhbWNpdHkuY29tLmF1Cnx8cmQuY29tCnx8cmRpby5jb20KfGh0dHBzOi8v +cmlzZXVwLm5ldAp8fHNhZGlzdGljLXYuY29tCnxodHRwOi8vY2RuKi5zZWFyY2gu +eHh4Lwp8fHNoaWtzaGEuY29tCnx8c2xhY2tlci5jb20KfHxzbS1taXJhY2xlLmNv +bQp8fHNwb3RpZnkuY29tCnx8c3ByZWFkc2hpcnQuZXMKfHxzcHJpbmdib2FyZHBs +YXRmb3JtLmNvbQp8fHNwcml0ZS5vcmcKQEB8aHR0cDovL3N0b3JlLnNwcml0ZS5v +cmcKfHxzdXBlcm9rYXlhbWEuY29tCnx8c3VwZXJwYWdlcy5jb20KfHxzd2FnYnVj +a3MuY29tCnx8c3dpdGNoMS5qcAp8fHRhcGFud2FwLmNvbQohLS18fHRhcmdldC5j +b20KIS0tQEB8fGludGwudGFyZ2V0LmNvbQp8fHRoZWJvZHlzaG9wLXVzYS5jb20K +fHx0bWEuY28uanAKfHx0cmFjZm9uZS5jb20KfHx0cnloZWFydC5qcAp8fHR1cm50 +YWJsZS5mbQp8fHR3ZXJraW5nYnV0dC5jb20KfHx1bG9wLm5ldAp8fHZlZ2FzcmVk +LmNvbQp8fHZldm8uY29tCnx8dmlwLWVudGVycHJpc2UuY29tCnxodHRwOi8vdml1 +LnR2L2NoLwp8aHR0cDovL3ZpdS50di9lbmNvcmUvCnxodHRwOi8vZWNzbS52cy5j +b20vCnx8d2Fuei1mYWN0b3J5LmNvbQp8fHNzbC53ZWJwYWNrLmRlCnx8d2hlcmV0 +b3dhdGNoLmNvbQp8fHdpbmdhbWVzdG9yZS5jb20KfHx3aXpjcmFmdHMubmV0Cnx8 +dm9kLnd3ZS5jb20KfHx4ZmluaXR5LmNvbQp8fHl0bi5jby5rcgp8fHphdHRvby5j +b20KfHx6aW0udm4KfHx6b3pvdG93bi5jb20KCiEjIyMjIyMjIyMjIyMjI0dlbmVy +YWwgTGlzdCBTdGFydCMjIyMjIyMjIyMjIyMjIwohLS0tLS0tLS0tLS0tLS0tLS0t +LVB1cmUgSVAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KfHwxLjEuMS4xCjE0LjEwMi4y +NTAuMTgKMTQuMTAyLjI1MC4xOQo1MC43LjMxLjIzMDo4ODk4CjE3NC4xNDIuMTA1 +LjE1Mwo2OS42NS4xOS4xNjAKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tSUROLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLQp8fHhuLS00Z3ExNzFwLmNvbQp8fHhuLS1jenE3 +NXB2djFhajVjLm9yZwp8fHhuLS1pMnJ1OHEycWcuY29tCnx8eG4tLXA4ajlhMGQ5 +YzlhLnhuLS1xOWp5YjRjCgohLS0tLS0tLS0tLS0tLS0tLS1ETlMgUG9pc29uaW5n +LS0tLS0tLS0tLS0tLS0tLS0KIS0tLUFtYXpvbi0tLQohLXx8Y2RuLWltYWdlcy5t +YWlsY2hpbXAuY29tCnxodHRwczovLyouczMuYW1hem9uYXdzLmNvbQp8fHMzLWFw +LXNvdXRoZWFzdC0yLmFtYXpvbmF3cy5jb20KCiEtLS1CaXRDb2luLS0tCnx8Ymlu +YW5jZS5jb20KfHxiaXRmaW5leC5jb20KfHxiaXRtZXguY29tCi5jb2luZWdnLmNv +bQp8fGNvaW5lZ2cuY29tCnx8Z2F0ZS5pbwp8fGhpdGJ0Yy5jb20KfHxodW9iaS5j +b20KfHxodW9iaS5wcm8KfHxodW9iaXByby5jb20KfHxsaXZlY29pbi5uZXQKfHxv +a2V4LmNvbQp8fHpiLmNvbQoKfHxhZ3JvLmhrCnx8YXBrbWlycm9yLmNvbQp8fGJv +b21zc3IuY29tCnx8Y2FzdGJveC5mbQp8fGRlcG9zaXRwaG90b3MuY29tCnx8ZmFu +Z2VxaWFuZy5jb20KfHxibG9nLmZ1Y2tnZncyMzMub3JnCnx8Z2xvYmFsdm9pY2Vz +Lm9yZwp8fGdsb3J5c3Rhci5tZQp8fGlwZnMuaW8KfHxqaWppLmNvbQp8fGxpbmUt +c2Nkbi5uZXQKfHxpLmxpdGhpdW0uY29tCnx8Y2xvdWQubWFpbC5ydQp8fGNkbi1p +bWFnZXMubWFpbGNoaW1wLmNvbQp8fGRpY3Rpb25hcnkuZ29vLm5lLmpwCnx8Z28u +bmVzbm9kZS5jb20KfHxuaWtrZWkuY29tCnx8cGFzdGUuZWUKfHxteS5wY2xvdWQu +Y29tCnx8cGljYWNvbWljLmNvbQp8fHBpeGl2Lm5ldAp8fHNlY3VyZS5yYXhjZG4u +Y29tCnx8c2hhZG93c29ja3M5LmNvbQp8fHNvc3JlYWRlci5jb20KfHxzdWxpYW4u +bWUKfHx1bnNlZW4uaXMKfHxjbi51cHRvZG93bi5jb20KfHx3aXJlLmNvbQp8fHht +LmNvbQp8fHh1ZWh1YS51cwoKIS0tLS0tLS0tLS0tLS0tLS1GcmF1ZHMgJiBTY2Ft +cy0tLS0tLS0tLS0tLS0tLS0tCiEhLS0tQ29udGVudCBGYXJtKGZha2UgNTAwIGVy +cm9yKS0tLQp8fHJlYWQwMS5jb20KfHxra25ld3MuY2MKCmNoaW5hLW1tbS5qcC5u +ZXQKLmxzeHN6emcuY29tCi5jaGluYS1tbW0ubmV0Cnx8Y2hpbmEtbW1tLm5ldApj +aGluYS1tbW0uc2EuY29tCgohLS0tLS0tLS0tLS0tLS0tLS0tLS0tR3JvdXBzLS0t +LS0tLS0tLS0tLS0tLS0tLS0KISEtLS1BZnJhaWQgRnJlZUROUy0tLQouYWxsb3dl +ZC5vcmcKLm5vdy5pbQoKISEtLS1BbWF6b24tLS0KLmFtYXpvbi5jb20vRGFsYWkt +TGFtYQpzMy1hcC1ub3J0aGVhc3QtMS5hbWF6b25hd3MuY29tCgohIS0tLUFPTC0t +LQp8fGFvbGNoYW5uZWxzLmFvbC5jb20KdmlkZW8uYW9sLmNhL3ZpZGVvLWRldGFp +bAp2aWRlby5hb2wuY28udWsvdmlkZW8tZGV0YWlsCnZpZGVvLmFvbC5jb20KfHx2 +aWRlby5hb2wuY29tCnx8c2VhcmNoLmFvbC5jb20Kd3d3LmFvbG5ld3MuY29tCgoh +IS0tLUF2TW9vLS0tCi5hdm1vLnB3CiEtLXxodHRwOi8vYXZtby5wdwouYXZtb28u +Y29tCnxodHRwOi8vYXZtb28uY29tCi5hdm1vby5uZXQKfGh0dHA6Ly9hdm1vby5u +ZXQKfHxhdm1vby5wdwouamF2bW9vLnh5egp8aHR0cDovL2phdm1vby54eXoKLmph +dnRhZy5jb20KfGh0dHA6Ly9qYXZ0YWcuY29tCi5qYXZ6b28uY29tCnxodHRwOi8v +amF2em9vLmNvbQoudGVsbG1lLnB3CgohIS0tLUJCQy0tLQouYmJjLmNvLnVrL2Js +b2dzCi5iYmMuY28udWsvY2hpbmVzZQouYmJjLmNvLnVrL25ld3Mvd29ybGQtYXNp +YS1jaGluYQouYmJjLmNvLnVrL3R2Ci5iYmMuY28udWsvemhvbmd3ZW4KLmJiYy5j +b20vdWtjaGluYQouYmJjLmNvbS96aG9uZ3dlbgouYmJjLmNvbSUyRnpob25nd2Vu +Cm5ld3MuYmJjLmNvLnVrL29udGhpc2RheSpuZXdzaWRfMjQ5NjAwMC8yNDk2Mjc3 +Cm5ld3Nmb3J1bXMuYmJjLmNvLnVrCi5iYmNjaGluZXNlLmNvbQp8fGJiY2NoaW5l +c2UuY29tCnxodHRwOi8vYmJjLmluCgohIS0tLUNoYW5nZUlQLS0tCi4xZHVtYi5j +b20KLjI1dS5jb20KLjJ3YWt5LmNvbQouMy1hLm5ldAouNGRxLmNvbQouNG15ZG9t +YWluLmNvbQouNHB1LmNvbQouYWNtZXRveS5jb20KLmFsbW9zdG15LmNvbQouYW1l +cmljYW51bmZpbmlzaGVkLmNvbQouYXV0aG9yaXplZGRucy5uZXQKLmF1dGhvcml6 +ZWRkbnMub3JnCi5hdXRob3JpemVkZG5zLnVzCi5iaWdtb25leS5iaXoKLmNoYW5n +ZWlwLm5hbWUKLmNoYW5nZWlwLm5ldAouY2hhbmdlaXAub3JnCi5jbGVhbnNpdGUu +Yml6Ci5jbGVhbnNpdGUuaW5mbwouY2xlYW5zaXRlLnVzCi5jb21wcmVzcy50bwou +ZGRucy5pbmZvCi5kZG5zLm1lLnVrCi5kZG5zLm1vYmkKLmRkbnMubXMKLmRkbnMu +bmFtZQouZGRucy51cwouZGhjcC5iaXoKLmRucy1kbnMuY29tCi5kbnMtc3R1ZmYu +Y29tCi5kbnMwNC5jb20KLmRuczA1LmNvbQouZG5zMS51cwouZG5zMi51cwouZG5z +ZXQuY29tCi5kbnNyZC5jb20KLmRzbXRwLmNvbQouZHVtYjEuY29tCi5keW5hbWlj +LWRucy5uZXQKLmR5bmFtaWNkbnMuYml6Ci5keW5hbWljZG5zLmNvLnVrCi5keW5h +bWljZG5zLm1lLnVrCi5keW5hbWljZG5zLm9yZy51awouZHluZG5zLnBybwouZHlu +c3NsLmNvbQouZWRucy5iaXoKLmVwYWMudG8KLmVzbXRwLmJpegouZXp1YS5jb20K +LmZhcXNlcnYuY29tCi5mYXJ0aXQuY29tCi5mcmVlZGRucy5jb20KLmZyZWV0Y3Au +Y29tCi5mcmVld3d3LmJpegouZnJlZXd3dy5pbmZvCi5mdHAxLmJpegouZnRwc2Vy +dmVyLmJpegouZ2V0dHJpYWxzLmNvbQouZ290LWdhbWUub3JnCi5ncjhkb21haW4u +Yml6Ci5ncjhuYW1lLmJpegouaHR0cHM0NDMubmV0Ci5odHRwczQ0My5vcmcKLmlr +d2IuY29tCi5pbnN0YW50aHEuY29tCi5pb3dueW91ci5iaXoKLmlvd255b3VyLm9y +ZwouaXNhc2VjcmV0LmNvbQouaXRlbWRiLmNvbQouaXRzYW9sLmNvbQouamV0b3Mu +Y29tCi5qa3ViLmNvbQouanVuZ2xlaGVhcnQuY29tCi5qdXN0ZGllZC5jb20KLmxm +bGluay5jb20KLmxmbGlua3VwLmNvbQoubGZsaW5rdXAubmV0Ci5sZmxpbmt1cC5v +cmcKLmxvbmdtdXNpYy5jb20KLm1lZm91bmQuY29tCi5tb25leWhvbWUuYml6Ci5t +cmJhc2ljLmNvbQoubXJib251cy5jb20KLm1yZmFjZS5jb20KLm1yc2xvdmUuY29t +Ci5teTAzLmNvbQoubXlkYWQuaW5mbwoubXlkZG5zLmNvbQoubXlmdHAuaW5mbwou +bXlmdHAubmFtZQoubXlsZnR2LmNvbQoubXltb20uaW5mbwoubXluZXRhdi5uZXQK +Lm15bmV0YXYub3JnCi5teW51bWJlci5vcmcKLm15cGljdHVyZS5pbmZvCi5teXBv +cDMubmV0Ci5teXBvcDMub3JnCi5teXNlY29uZGFyeWRucy5jb20KLm15d3d3LmJp +egoubXl6LmluZm8KLm5pbnRoLmJpegoubnMwMS5iaXoKLm5zMDEuaW5mbwoubnMw +MS51cwoubnMwMi5iaXoKLm5zMDIuaW5mbwoubnMwMi51cwoubnMxLm5hbWUKLm5z +Mi5uYW1lCi5uczMubmFtZQoub2NyeS5jb20KLm9uZWR1bWIuY29tCi5vbm15cGMu +Yml6Ci5vbm15cGMuaW5mbwoub25teXBjLm5ldAoub25teXBjLm9yZwoub25teXBj +LnVzCi5vcmdhbmljY3JhcC5jb20KLm90em8uY29tCi5vdXJob2JieS5jb20KLnBj +YW55d2hlcmUubmV0Ci5wb3J0MjUuYml6Ci5wcm94eWRucy5jb20KLnFoaWdoLmNv +bQoucXBvZS5jb20KLnJlYmF0ZXNydWxlLm5ldAouc2VsbGNsYXNzaWNzLmNvbQou +c2VuZHNtdHAuY29tCi5zZXJ2ZXVzZXIuY29tCi5zZXJ2ZXVzZXJzLmNvbQouc2V4 +aWR1ZGUuY29tCi5zZXh4eHkuYml6Ci5zaXh0aC5iaXoKLnNxdWlybHkuaW5mbwou +c3NsNDQzLm9yZwoudG9oLmluZm8KLnRveXRoaWV2ZXMuY29tCi50cmlja2lwLm5l +dAoudHJpY2tpcC5vcmcKLnZpenZhei5jb20KLndoYS5sYQoud2lrYWJhLmNvbQou +d3d3MS5iaXoKLnd3d2hvc3QuYml6CkBAfGh0dHA6Ly94eC53d3dob3N0LmJpegou +eDI0aHIuY29tCi54eHV6LmNvbQoueHh4eS5iaXoKLnh4eHkuaW5mbwoueWd0by5j +b20KLnlvdWRvbnRjYXJlLmNvbQoueW91cnRyYXAuY29tCi56eW5zLmNvbQouenp1 +eC5jb20KCiEhLS0tQ2xvdWRGcm9udC0tLQpkMWIxODNzZzBudm51aC5jbG91ZGZy +b250Lm5ldAp8aHR0cHM6Ly9kMWIxODNzZzBudm51aC5jbG91ZGZyb250Lm5ldApk +MWMzN2dqd2EyNnRhYS5jbG91ZGZyb250Lm5ldAp8aHR0cHM6Ly9kMWMzN2dqd2Ey +NnRhYS5jbG91ZGZyb250Lm5ldApkM2MzM2hjZ2l3ZXYzLmNsb3VkZnJvbnQubmV0 +CnxodHRwczovL2QzYzMzaGNnaXdldjMuY2xvdWRmcm9udC5uZXQKfHxkM3Jocjdr +Z210cnExdi5jbG91ZGZyb250Lm5ldAoKISEtLS1EdEROUy0tLQohIyMjaHR0cHM6 +Ly93d3cuZHRkbnMuY29tL2R0c2l0ZS9mYXEKLjNkLWdhbWUuY29tCi40aXJjLmNv +bQouYjBuZS5jb20KLmNoYXRub29rLmNvbQouZGFya3RlY2gub3JnCi5kZWFmdG9u +ZS5jb20KLmR0ZG5zLm5ldAouZWZmZXJzLmNvbQouZXRvd25zLm5ldAouZXRvd25z +Lm9yZwouZmxuZXQub3JnCi5nb3RnZWVrcy5jb20KLnNjaWVyb24uY29tCi5zbHlp +cC5jb20KLnNseWlwLm5ldAouc3Vyb290LmNvbQoKISEtLS1EeW5ETlMtLS0KISMj +I2h0dHBzOi8vaGVscC5keW4uY29tL2xpc3Qtb2YtZHluLWRucy1wcm8tcmVtb3Rl +LWFjY2Vzcy1kb21haW4tbmFtZXMvCi5ibG9nZG5zLm9yZwouZHluZG5zLm9yZwou +ZHluZG5zLWlwLmNvbQouZHluZG5zLXBpY3MuY29tCi5mcm9tLXNkLmNvbQouZnJv +bS1wci5jb20KLmlzLWEtaHVudGVyLmNvbQoKISEtLS1EeW51LS0tCi5keW51LmNv +bQouZHludS5uZXQKLmZyZWVkZG5zLm9yZwoKISEtLS1GYWNlYm9vay0tLQpjZG5p +bnN0YWdyYW0uY29tCnx8Y2RuaW5zdGFncmFtLmNvbQp8fGZhY2Vib29rLmJyCi5m +YWNlYm9vay5jb20KfHxmYWNlYm9vay5jb20KIS0tL15odHRwcz86XC9cL1teXC9d +K2ZhY2Vib29rXC5jb20vCkBAfHx2Ni5mYWNlYm9vay5jb20KfHxmYWNlYm9vay5k ZXNpZ24KfHxjb25uZWN0LmZhY2Vib29rLm5ldAp8fGZhY2Vib29rLmh1Cnx8ZmFj ZWJvb2suaW4KfHxmYWNlYm9vay5ubAp8fGZhY2Vib29rLnNlCnx8ZmIuY29tCnx8 -ZmIubWUKfHxtLm1lCnx8bWVzc2VuZ2VyLmNvbQp8fG9jdWx1cy5jb20KCiEhLS0t -R29vZ2xlLS0tCiEjIyNodHRwczovL3d3dy5nb29nbGUuY29tL3N1cHBvcnRlZF9k -b21haW5zIyMjCiEuLi5HRldMaXN0IGRvZXNuJ3QgaW50ZW5kIHRvIHN1cHBvcnQg -dHlwb3NxdWF0dGluZy4uLgp8fDFlMTAwLm5ldAp8fGFiYy54eXoKfHxhZG1vYi5j -b20KfHxhZ29vZ2xlYWRheS5jb20KfHxhbXBwcm9qZWN0Lm9yZwp8fGFuZHJvaWQu -Y29tCnx8YW5kcm9pZGlmeS5jb20KLmFwcHNwb3QuY29tCnx8YXBwc3BvdC5jb20K -YmxvZ3Nwb3QuY29tCi9eaHR0cHM/OlwvXC9bXlwvXStibG9nc3BvdFwuKC4qKS8K -fHxjZXJ0aWZpY2F0ZS10cmFuc3BhcmVuY3kub3JnCnx8Y2hyb21lLmNvbQp8fGNo -cm9tZWNhc3QuY29tCnx8Y2hyb21lZXhwZXJpbWVudHMuY29tCnx8Y2hyb21lcmNp -c2UuY29tCnx8Y2hyb21lc3RhdHVzLmNvbQp8fGNocm9taXVtLm9yZwp8fGNvbS5n -b29nbGUKfHxkYXRhLXZvY2FidWxhcnkub3JnCnx8ZGVlcG1pbmQuY29tCnx8ZGVq -YS5jb20KfHxkaWdpc2ZlcmEuY29tCnx8ZG9tYWlucy5nb29nbGUKfHxmZWVkYnVy -bmVyLmNvbQp8fGcuY28KfHxnY3IuaW8KfHxnZXQuaG93Cnx8Z2V0bWRsLmlvCnx8 -Z2dwaHQuY29tCnx8Z21haWwuY29tCnx8Z21vZHVsZXMuY29tCnx8Z29kb2Mub3Jn -Cnx8Z29sYW5nLm9yZwp8fGdvby5nbAouZ29vZ2xlLmFlCi5nb29nbGUuYXMKLmdv -b2dsZS5hbQouZ29vZ2xlLmNhdAouZ29vZ2xlLmNkCi5nb29nbGUuY2kKLmdvb2ds -ZS5jby5pZAouZ29vZ2xlLmNvLmpwCi5nb29nbGUuY28ua3IKLmdvb2dsZS5jby5t -YQouZ29vZ2xlLmNvLnVrCi5nb29nbGUuY29tCi5nb29nbGUuZGUKLmdvb2dsZS5k -agouZ29vZ2xlLmRrCi5nb29nbGUuZXMKLmdvb2dsZS5maQouZ29vZ2xlLmZtCi5n -b29nbGUuZnIKLmdvb2dsZS5nZwouZ29vZ2xlLmllCi5nb29nbGUuaXMKLmdvb2ds -ZS5pdAouZ29vZ2xlLmpvCi5nb29nbGUubXMKLmdvb2dsZS5ubAouZ29vZ2xlLm51 -Ci5nb29nbGUubm8KLmdvb2dsZS5ybwouZ29vZ2xlLnNjCi5nb29nbGUuc2gKLmdv -b2dsZS5zawouZ29vZ2xlLnNtCi5nb29nbGUudGsKLmdvb2dsZS50bwouZ29vZ2xl -LnR0Ci5nb29nbGUudnUKLmdvb2dsZS53cwovXmh0dHBzPzpcL1wvKFteXC9dK1wu -KSpnb29nbGVcLihhY3xhZHxhZXxhbHxhbXxhc3xhdHxhenxiYXxiZXxiZnxiZ3xi -aXxianxic3xidHxieXxjYXxjYXR8Y2R8Y2Z8Y2d8Y2h8Y2l8Y2x8Y218Y28uYW98 -Y28uYnd8Y28uY2t8Y28uY3J8Y28uaWR8Y28uaWx8Y28uaW58Y28uanB8Y28ua2V8 -Y28ua3J8Y28ubHN8Y28ubWF8Y29tfGNvbS5hZnxjb20uYWd8Y29tLmFpfGNvbS5h -cnxjb20uYXV8Y29tLmJkfGNvbS5iaHxjb20uYm58Y29tLmJvfGNvbS5icnxjb20u -Ynp8Y29tLmNvfGNvbS5jdXxjb20uY3l8Y29tLmRvfGNvbS5lY3xjb20uZWd8Y29t -LmV0fGNvbS5manxjb20uZ2h8Y29tLmdpfGNvbS5ndHxjb20uaGt8Y29tLmptfGNv -bS5raHxjb20ua3d8Y29tLmxifGNvbS5seXxjb20ubW18Y29tLm10fGNvbS5teHxj -b20ubXl8Y29tLm5hfGNvbS5uZnxjb20ubmd8Y29tLm5pfGNvbS5ucHxjb20ub218 -Y29tLnBhfGNvbS5wZXxjb20ucGd8Y29tLnBofGNvbS5wa3xjb20ucHJ8Y29tLnB5 -fGNvbS5xYXxjb20uc2F8Y29tLnNifGNvbS5zZ3xjb20uc2x8Y29tLnN2fGNvbS50 -anxjb20udHJ8Y29tLnR3fGNvbS51YXxjb20udXl8Y29tLnZjfGNvbS52bnxjby5t -enxjby5uenxjby50aHxjby50enxjby51Z3xjby51a3xjby51enxjby52ZXxjby52 -aXxjby56YXxjby56bXxjby56d3xjdnxjenxkZXxkanxka3xkbXxkenxlZXxlc3xm -aXxmbXxmcnxnYXxnZXxnZ3xnbHxnbXxncHxncnxneXxoa3xobnxocnxodHxodXxp -ZXxpbXxpcXxpc3xpdHxqZXxqb3xrZ3xraXxrenxsYXxsaXxsa3xsdHxsdXxsdnxt -ZHxtZXxtZ3xta3xtbHxtbnxtc3xtdXxtdnxtd3xteHxuZXxubHxub3xucnxudXxv -cmd8cGx8cG58cHN8cHR8cm98cnN8cnV8cnd8c2N8c2V8c2h8c2l8c2t8c218c258 -c298c3J8c3R8dGR8dGd8dGt8dGx8dG18dG58dG98dHR8dXN8dmd8dm58dnV8d3Mp -XC8uKi8KIS0tfHxnb29nbGUtYW5hbHl0aWNzLmNvbQohLS18fGdvb2dsZWFkc2Vy -dmljZXMuY29tCnx8Z29vZ2xlYXBpcy5jbgp8fGdvb2dsZWFwaXMuY29tCnx8Z29v -Z2xlYXBwcy5jb20KfHxnb29nbGVhcnRwcm9qZWN0LmNvbQp8fGdvb2dsZWJsb2cu -Y29tCnx8Z29vZ2xlYm90LmNvbQp8fGdvb2dsZWNvZGUuY29tCnx8Z29vZ2xlY29t -bWVyY2UuY29tCnx8Z29vZ2xlZG9tYWlucy5jb20KfHxnb29nbGVlYXJ0aC5jb20K -fHxnb29nbGVkcml2ZS5jb20KfHxnb29nbGVncm91cHMuY29tCnx8Z29vZ2xlY2Fw -aXRhbC5jb20KfHxnb29nbGVob3N0ZWQuY29tCnx8Z29vZ2xlaWRlYXMuY29tCnx8 -Z29vZ2xlbGFicy5jb20KfHxnb29nbGVtYWlsLmNvbQp8fGdvb2dsZXBsYXkuY29t -Cnx8Z29vZ2xlcGx1cy5jb20KfHxnb29nbGVzb3VyY2UuY29tCiEtLXx8Z29vZ2xl -c3luZGljYXRpb24uY29tCiEtLXx8Z29vZ2xldGFnbWFuYWdlci5jb20KIS0tfHxn -b29nbGV0YWdzZXJ2aWNlcy5jb20KfHxnb29nbGV1c2VyY29udGVudC5jb20KfHxn -b29nbGV2aWRlby5jb20KfHxnb29nbGV6aXAubmV0Cnx8Z3JvdXBzLmdvb2dsZS5j -bgp8fGd2dDAuY29tCnx8Z3Z0MS5jb20KfHxndnQzLmNvbQp8fGd3dHByb2plY3Qu -b3JnCnx8aHRtbDVyb2Nrcy5jb20KfHxpYW0uc295Cnx8aWdvb2dsZS5jb20KfHxp -dGFzb2Z0d2FyZS5jb20KfHxsaWtlLmNvbQp8fG1hZGV3aXRoY29kZS5jb20KfHxt -YXRlcmlhbC5pbwp8fG5pYy5nb29nbGUKfHxvbjIuY29tCnx8cGFub3JhbWlvLmNv -bQp8fHBpY2FzYXdlYi5jb20KfHxwb2x5bWVyLXByb2plY3Qub3JnCnx8cXVlc3R2 -aXN1YWwuY29tCnx8cmVjYXB0Y2hhLm5ldAp8fHJlZGhvdGxhYnMuY29tCnx8cmVn -aXN0cnkuZ29vZ2xlCnx8c2NoZW1hLm9yZwp8aHR0cDovL3NpcG1sNS5vcmcvCnx8 -c3Rvcmllcy5nb29nbGUKfHxzeW5lcmd5c2UuY29tCnx8dGVuc29yZmxvdy5vcmcK -fHx0aGlua3dpdGhnb29nbGUuY29tCnx8dGlsdGJydXNoLmNvbQohLS18fHd3dy5n -b29nbGUKfHx3YXZlcHJvdG9jb2wub3JnCnx8d2VibXByb2plY3Qub3JnCnx8d2Vi -cnRjLm9yZwp8fHdoYXRicm93c2VyLm9yZwp8fHdpdGhnb29nbGUuY29tCnx8eW91 -dHUuYmUKLnlvdXR1YmUuY29tCnx8eW91dHViZS5jb20KfHx5b3V0dWJlLW5vY29v -a2llLmNvbQp8fHlvdXR1YmVlZHVjYXRpb24uY29tCnx8eXRpbWcuY29tCnx8enlu -YW1pY3MuY29tCgohIS0tLUtpY2tBU1MtLS0KIS0tT0ZGSUNJQUwgVVJMIGxpc3Qg -YXQ6IGh0dHBzOi8va2FzdGF0dXMuY29tCi5rYXQuY3IKCiEhLS0tTmF1Z2h0eUFt -ZXJpY2EtLS0KfHxuYXVnaHR5YW1lcmljYS5jb20KCiEhLS0tVjJFWC0tLQoudjJl -eC5jb20KIS0tSW5jbHVkZWQgaW4gYWJvdmUgcnVsZTogZG5zLnYyZXguY29tCkBA -fGh0dHA6Ly92MmV4LmNvbQpAQHxodHRwOi8vY2RuLnYyZXguY29tCkBAfGh0dHA6 -Ly9jbi52MmV4LmNvbQpAQHxodHRwOi8vaGsudjJleC5jb20KQEB8aHR0cDovL2ku -djJleC5jb20KQEB8aHR0cDovL2xheC52MmV4LmNvbQpAQHxodHRwOi8vbmV1ZS52 -MmV4LmNvbQpAQHxodHRwOi8vcGFnZXNwZWVkLnYyZXguY29tCkBAfGh0dHA6Ly9z -dGF0aWMudjJleC5jb20KQEB8aHR0cDovL3dvcmtzcGFjZS52MmV4LmNvbQpAQHxo -dHRwOi8vd3d3LnYyZXguY29tCgohLS0tLS0tLS0tLS0tLS0tLS0tTnVtZXJpY3Mt -LS0tLS0tLS0tLS0tLS0tLS0tLS0KLjByei50dwp8aHR0cDovLzByei50dwp8fDB0 -bzI1NS5jb20KMS1hcHBsZS5jb20udHcKfHwxLWFwcGxlLmNvbS50dwouMTAwa2Uu -b3JnCi4xMDAwZ2lyaS5uZXQKfHwxMDAwZ2lyaS5uZXQKLjEwY29uZGl0aW9uc29m -bG92ZS5jb20KfHwxMG11c3VtZS5jb20KMTIzcmYuY29tCi4xMmJldC5jb20KfHwx -MmJldC5jb20KLjEydnBuLmNvbQouMTJ2cG4ubmV0Cnx8MTJ2cG4uY29tCnx8MTJ2 -cG4ubmV0CjE0MWhvbmdrb25nLmNvbS9mb3J1bQouMTQxdHViZS5jb20KLjE2ODgu -Y29tLmF1Ci4xNzNuZy5jb20KfHwxNzNuZy5jb20KLjE3N3BpYy5pbmZvCi4xN3Qx -N3AuY29tCjE4b25seWdpcmxzLmNvbQouMTh2aXJnaW5zZXguY29tCi4xOTQ5ZXIu -b3JnCnpoYW8uMTk4NC5jaXR5Cnx8emhhby4xOTg0LmNpdHkKMTk4NGJicy5jb20K -fHwxOTg0YmJzLmNvbQohLS18fDE5ODRibG9nLmNvbQouMTk4NGJicy5vcmcKfHwx -OTg0YmJzLm9yZwouMTk5OGNkcC5vcmcKLjFiYW8ub3JnCnxodHRwOi8vMWJhby5v -cmcKLjFlZXcuY29tCi4xbW9iaWxlLmNvbQp8aHR0cDovLyouMW1vYmlsZS50dwp8 -fDFwb25kby50dgouMi1oYW5kLmluZm8KLjIwMDBmdW4uY29tL2JicwouMjAwOHhp -YW56aGFuZy5pbmZvCnx8MjAwOHhpYW56aGFuZy5pbmZvCnx8MjAxNy5oawoyMWFu -ZHkuY29tL2Jsb2cKLjIxcHJvbi5jb20KMjFzZXh0dXJ5LmNvbQouMjI4Lm5ldC50 -dwp8fDI0aHJzLmNhCjI0c21pbGUub3JnCjJsaXBzdHViZS5jb20KLjJzaGFyZWQu -Y29tCjMwYm94ZXMuY29tCi4zMTVsei5jb20KfHwzMnJlZC5jb20KfHwzNnJhaW4u -Y29tCi4zYTVhLmNvbQozYXJhYnR2LmNvbQouM2JveXMyZ2lybHMuY29tCi4zcmVu -LmNhCi4zdHVpLm5ldAp8fDRibHVlc3RvbmVzLmJpegohLS18fDRjaGFuLm9yZwou -NGV2ZXJwcm94eS5jb20KfHw0ZXZlcnByb3h5LmNvbQp8fDRyYnR2LmNvbQp8fDRz -aGFyZWQuY29tCnRhaXdhbm5hdGlvbi41MHdlYnMuY29tCnx8NTEuY2EKfHw1MWph -di5vcmcKLjUxbHVvYmVuLmNvbQp8fDUxbHVvYmVuLmNvbQouNTI3OC5jYwo1YWlt -aWt1LmNvbQo1aTAxLmNvbQouNWlzb3RvaTUub3JnCi41bWFvZGFuZy5jb20KfHw2 -M2kuY29tCi42NG11c2V1bS5vcmcKNjR0aWFud2FuZy5jb20KNjR3aWtpLmNvbQou -NjYuY2EKNjY2a2IuY29tCjZwYXJrLmNvbQp8fDZwYXJrLmNvbQp8fDdjYXB0dXJl -LmNvbQouN2Nvdy5jb20KLjgtZC5jb20KfGh0dHA6Ly84LWQuY29tCjg1Y2MubmV0 -CnxodHRwOi8vODVzdC5jb20KLjg4MTkwMy5jb20vcGFnZS96aC10dy8KfHw4ODE5 -MDMuY29tCi44ODguY29tCi44ODhwb2tlci5jb20KODktNjQub3JnCnx8ODktNjQu -b3JnCi44bmV3cy5jb20udHcKLjh6MS5uZXQKfHw4ejEubmV0Ci45MDAxNzAwLmNv -bQp8aHR0cDovLzkwOHRhaXdhbi5vcmcvCnx8OTFwb3JuLmNvbQouOTJjY2F2LmNv -bQouOTkxLmNvbQp8aHR0cDovLzk5MS5jb20KLjk5YnRnYzAxLmNvbQp8fDk5YnRn -YzAxLmNvbQouOTljbi5pbmZvCnxodHRwOi8vOTljbi5pbmZvCnx8OWJpcy5jb20K -fHw5YmlzLm5ldAoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tQUEtLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tCi50aWJldC5hLnNlCnxodHRwOi8vdGliZXQuYS5zZQp8fGEt -bm9ybWFsLWRheS5jb20KYTUuY29tLnJ1CnxodHRwOi8vYWFtYWNhdS5jb20KIS0t -fGh0dHA6Ly9jZG4qLmFiYy5jb20vCi5hYmMuY29tCi5hYmNoaW5lc2UuY29tCi5h -Ymx3YW5nLmNvbQouYWJvbHVvd2FuZy5jb20KfHxhYm9sdW93YW5nLmNvbQouYWJv -dXRnZncuY29tCi5hYnMuZWR1Ci5hY2NpbS5vcmcKLmFjZXJvcy1kZS1oaXNwYW5p -YS5jb20KLmFjZXZwbi5jb20KfHxhY2V2cG4uY29tCi5hY2cxOC5tZQp8aHR0cDov -L2FjZzE4Lm1lCnx8YWNna2ouY29tCmFjdGltZXMuY29tLmF1CmFjdGl2cG4uY29t -Cnx8YWN0aXZwbi5jb20KfHxhY3Vsby51cwp8fGFkZGljdGVkdG9jb2ZmZWUuZGUK -LmFkZWxhaWRlYmJzLmNvbS9iYnMKLmFkcGwub3JnLmhrCnxodHRwOi8vYWRwbC5v -cmcuaGsKLmFkdWx0LXNleC1nYW1lcy5jb20KfHxhZHVsdC1zZXgtZ2FtZXMuY29t -CmFkdWx0ZnJpZW5kZmluZGVyLmNvbQphZHVsdGtlZXAubmV0L3BlZXBzaG93L21l -bWJlcnMvbWFpbi5odG0KfHxhZHZhbnNjZW5lLmNvbQp8fGFkdmVydGZhbi5jb20K -LmFlLm9yZwp8fGFlbmhhbmNlcnMuY29tCnx8YWYubWlsCi5hZmFudGliYnMuY29t -CnxodHRwOi8vYWZhbnRpYmJzLmNvbQouYWkta2FuLm5ldAp8fGFpLWthbi5uZXQK -YWktd2VuLm5ldAouYWlwaC5uZXQKfHxhaXBoLm5ldAp8fGFpcmNvbnNvbGUuY29t -CnxodHRwOi8vZG93bmxvYWQuYWlyY3JhY2stbmcub3JnCi5haXJ2cG4ub3JnCnx8 -YWlydnBuLm9yZwouYWlzZXguY29tCnx8YWl0Lm9yZy50dwphaXdlaXdlaS5jb20K -LmFpd2Vpd2VpYmxvZy5jb20KfHxhaXdlaXdlaWJsb2cuY29tCnx8d3d3LmFqc2Fu -ZHMuY29tCgohIS0tLUFrYW1haS0tLQp8aHR0cHM6Ly9mYmNkbiouYWthbWFpaGQu -bmV0LwphMjQ4LmUuYWthbWFpLm5ldAp8fGEyNDguZS5ha2FtYWkubmV0CnZvYS0x +ZmIubWUKfHxmYmNkbi5uZXQKfHxmYnNieC5jb20KLmluc3RhZ3JhbS5jb20KfHxp +bnN0YWdyYW0uY29tCnx8bS5tZQp8fG1lc3Nlbmdlci5jb20KfHxvY3VsdXMuY29t +Cnx8b2N1bHVzY2RuLmNvbQp8fHJvY2tzZGIub3JnCkBAfHxpcDYuc3RhdGljLnNs +LXJldmVyc2UuY29tCnx8dGhlZmFjZWJvb2suY29tCnx8d2hhdHNhcHAubmV0Cgoh +IS0tLUdvb2dsZS0tLQohIyMjaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0 +ZWRfZG9tYWlucyMjIwohLi4uR0ZXTGlzdCBkb2Vzbid0IGludGVuZCB0byBzdXBw +b3J0IHR5cG9zcXVhdHRpbmcuLi4KfHwxZTEwMC5uZXQKfHw0NjY0NTMuY29tCnx8 +YWJjLnh5egp8fGFkbW9iLmNvbQp8fGFkc2Vuc2UuY29tCnx8YWdvb2dsZWFkYXku +Y29tCnx8YW1wcHJvamVjdC5vcmcKfHxhbmRyb2lkLmNvbQp8fGFuZHJvaWRpZnku +Y29tCnx8YXBpLmFpCi5hcHBzcG90LmNvbQp8fGFwcHNwb3QuY29tCnx8YXV0b2Ry +YXcuY29tCnx8YmxvZy5nb29nbGUKfHxibG9nYmxvZy5jb20KYmxvZ3Nwb3QuY29t +Ci9eaHR0cHM/OlwvXC9bXlwvXStibG9nc3BvdFwuKC4qKS8KLmJsb2dzcG90Lmhr +Ci5ibG9nc3BvdC5qcAohLS18fGNhcGl0YWxnLmNvbQp8fGNlcnRpZmljYXRlLXRy +YW5zcGFyZW5jeS5vcmcKfHxjaHJvbWUuY29tCnx8Y2hyb21lY2FzdC5jb20KfHxj +aHJvbWVleHBlcmltZW50cy5jb20KfHxjaHJvbWVyY2lzZS5jb20KfHxjaHJvbWVz +dGF0dXMuY29tCnx8Y2hyb21pdW0ub3JnCnx8Y29tLmdvb2dsZQp8fGNyZWF0aXZl +bGFiNS5jb20KfHxjcnJldi5jb20KfHxkYXRhLXZvY2FidWxhcnkub3JnCnx8ZGVi +dWcuY29tCnx8ZGVlcG1pbmQuY29tCnx8ZGVqYS5jb20KfHxkZXNpZ24uZ29vZ2xl +Cnx8ZGlnaXNmZXJhLmNvbQp8fGRvbWFpbnMuZ29vZ2xlCnx8ZHVjay5jb20KfHxl +bnZpcm9ubWVudC5nb29nbGUKfHxmZWVkYnVybmVyLmNvbQp8fGZpcmViYXNlaW8u +Y29tCnx8Zy5jbwp8fGdjci5pbwp8fGdldC5ob3cKfHxnZXRtZGwuaW8KfHxnZ3Bo +dC5jb20KfHxnbWFpbC5jb20KfHxnbW9kdWxlcy5jb20KfHxnb2RvYy5vcmcKfHxn +b2xhbmcub3JnCnx8Z29vLmdsCi5nb29nbGUuYWUKLmdvb2dsZS5hcwouZ29vZ2xl +LmFtCi5nb29nbGUuYXQKLmdvb2dsZS5hegouZ29vZ2xlLmJhCi5nb29nbGUuYmUK +Lmdvb2dsZS5iZwouZ29vZ2xlLmNhCi5nb29nbGUuY2QKLmdvb2dsZS5jaQouZ29v +Z2xlLmNvLmlkCi5nb29nbGUuY28uanAKLmdvb2dsZS5jby5rcgouZ29vZ2xlLmNv +Lm1hCi5nb29nbGUuY28udWsKLmdvb2dsZS5jb20KLmdvb2dsZS5kZQouZ29vZ2xl +LmRqCi5nb29nbGUuZGsKLmdvb2dsZS5lcwouZ29vZ2xlLmZpCi5nb29nbGUuZm0K +Lmdvb2dsZS5mcgouZ29vZ2xlLmdnCi5nb29nbGUuZ2wKLmdvb2dsZS5ncgouZ29v +Z2xlLmllCi5nb29nbGUuaXMKLmdvb2dsZS5pdAouZ29vZ2xlLmpvCi5nb29nbGUu +a3oKLmdvb2dsZS5sdgouZ29vZ2xlLm1uCi5nb29nbGUubXMKLmdvb2dsZS5ubAou +Z29vZ2xlLm51Ci5nb29nbGUubm8KLmdvb2dsZS5ybwouZ29vZ2xlLnJ1Ci5nb29n +bGUucncKLmdvb2dsZS5zYwouZ29vZ2xlLnNoCi5nb29nbGUuc2sKLmdvb2dsZS5z +bQouZ29vZ2xlLnNuCi5nb29nbGUudGsKLmdvb2dsZS50bQouZ29vZ2xlLnRvCi5n +b29nbGUudHQKLmdvb2dsZS52dQouZ29vZ2xlLndzCi9eaHR0cHM/OlwvXC8oW15c +L10rXC4pKmdvb2dsZVwuKGFjfGFkfGFlfGFmfGFsfGFtfGFzfGF0fGF6fGJhfGJl +fGJmfGJnfGJpfGJqfGJzfGJ0fGJ5fGNhfGNhdHxjZHxjZnxjZ3xjaHxjaXxjbHxj +bXxjby5hb3xjby5id3xjby5ja3xjby5jcnxjby5pZHxjby5pbHxjby5pbnxjby5q +cHxjby5rZXxjby5rcnxjby5sc3xjby5tYXxjb218Y29tLmFmfGNvbS5hZ3xjb20u +YWl8Y29tLmFyfGNvbS5hdXxjb20uYmR8Y29tLmJofGNvbS5ibnxjb20uYm98Y29t +LmJyfGNvbS5ienxjb20uY298Y29tLmN1fGNvbS5jeXxjb20uZG98Y29tLmVjfGNv +bS5lZ3xjb20uZXR8Y29tLmZqfGNvbS5naHxjb20uZ2l8Y29tLmd0fGNvbS5oa3xj +b20uam18Y29tLmtofGNvbS5rd3xjb20ubGJ8Y29tLmx5fGNvbS5tbXxjb20ubXR8 +Y29tLm14fGNvbS5teXxjb20ubmF8Y29tLm5mfGNvbS5uZ3xjb20ubml8Y29tLm5w +fGNvbS5vbXxjb20ucGF8Y29tLnBlfGNvbS5wZ3xjb20ucGh8Y29tLnBrfGNvbS5w +cnxjb20ucHl8Y29tLnFhfGNvbS5zYXxjb20uc2J8Y29tLnNnfGNvbS5zbHxjb20u +c3Z8Y29tLnRqfGNvbS50cnxjb20udHd8Y29tLnVhfGNvbS51eXxjb20udmN8Y29t +LnZufGNvLm16fGNvLm56fGNvLnRofGNvLnR6fGNvLnVnfGNvLnVrfGNvLnV6fGNv +LnZlfGNvLnZpfGNvLnphfGNvLnptfGNvLnp3fGN2fGN6fGRlfGRqfGRrfGRtfGR6 +fGVlfGVzfGV1fGZpfGZtfGZyfGdhfGdlfGdnfGdsfGdtfGdwfGdyfGd5fGhrfGhu +fGhyfGh0fGh1fGllfGltfGlxfGlzfGl0fGl0LmFvfGplfGpvfGtnfGtpfGt6fGxh +fGxpfGxrfGx0fGx1fGx2fG1kfG1lfG1nfG1rfG1sfG1ufG1zfG11fG12fG13fG14 +fG5lfG5sfG5vfG5yfG51fG9yZ3xwbHxwbnxwc3xwdHxyb3xyc3xydXxyd3xzY3xz +ZXxzaHxzaXxza3xzbXxzbnxzb3xzcnxzdHx0ZHx0Z3x0a3x0bHx0bXx0bnx0b3x0 +dHx1c3x2Z3x2bnx2dXx3cylcLy4qLwohLS18fGdvb2dsZS1hbmFseXRpY3MuY29t +CiEtLXx8Z29vZ2xlYWRzZXJ2aWNlcy5jb20KfHxnb29nbGVhcGlzLmNuCnx8Z29v +Z2xlYXBpcy5jb20KfHxnb29nbGVhcHBzLmNvbQp8fGdvb2dsZWFydHByb2plY3Qu +Y29tCnx8Z29vZ2xlYmxvZy5jb20KfHxnb29nbGVib3QuY29tCiEtLXx8Z29vZ2xl +Y2FwaXRhbC5jb20KfHxnb29nbGVjaGluYXdlYm1hc3Rlci5jb20KfHxnb29nbGVj +b2RlLmNvbQp8fGdvb2dsZWNvbW1lcmNlLmNvbQp8fGdvb2dsZWRvbWFpbnMuY29t +Cnx8Z29vZ2xlYXJ0aC5jb20KfHxnb29nbGVlYXJ0aC5jb20KfHxnb29nbGVkcml2 +ZS5jb20KfHxnb29nbGVncm91cHMuY29tCnx8Z29vZ2xlaG9zdGVkLmNvbQp8fGdv +b2dsZWlkZWFzLmNvbQp8fGdvb2dsZWluc2lkZXNlYXJjaC5jb20KfHxnb29nbGVs +YWJzLmNvbQp8fGdvb2dsZW1haWwuY29tCnx8Z29vZ2xlbWFzaHVwcy5jb20KfHxn +b29nbGVwYWdlY3JlYXRvci5jb20KfHxnb29nbGVwbGF5LmNvbQp8fGdvb2dsZXBs +dXMuY29tCnx8Z29vZ2xlc2Nob2xhci5jb20KfHxnb29nbGVzb3VyY2UuY29tCiEt +LXx8Z29vZ2xlc3luZGljYXRpb24uY29tCiEtLXx8Z29vZ2xldGFnbWFuYWdlci5j +b20KIS0tfHxnb29nbGV0YWdzZXJ2aWNlcy5jb20KfHxnb29nbGV1c2VyY29udGVu +dC5jb20KLmdvb2dsZXZpZGVvLmNvbQp8fGdvb2dsZXZpZGVvLmNvbQp8fGdvb2ds +ZXdlYmxpZ2h0LmNvbQp8fGdvb2dsZXppcC5uZXQKfHxncm91cHMuZ29vZ2xlLmNu +Cnx8Z3N0YXRpYy5jb20KIS0tfHxndi5jb20KfHxndnQwLmNvbQp8fGd2dDEuY29t +CkBAfHxyZWRpcmVjdG9yLmd2dDEuY29tCnx8Z3Z0My5jb20KfHxnd3Rwcm9qZWN0 +Lm9yZwp8fGh0bWw1cm9ja3MuY29tCnx8aWFtLnNveQp8fGlnb29nbGUuY29tCnx8 +aXRhc29mdHdhcmUuY29tCnx8bGVycy5nb29nbGUKfHxsaWtlLmNvbQp8fG1hZGV3 +aXRoY29kZS5jb20KfHxtYXRlcmlhbC5pbwp8fG5pYy5nb29nbGUKfHxvbjIuY29t +Cnx8cGFub3JhbWlvLmNvbQp8fHBpY2FzYXdlYi5jb20KfHxwb2x5bWVyLXByb2pl +Y3Qub3JnCnx8cXVlc3R2aXN1YWwuY29tCnx8YXBpLnJlY2FwdGNoYS5uZXQKfHxh +cGktc2VjdXJlLnJlY2FwdGNoYS5uZXQKfHxhcGktdmVyaWZ5LnJlY2FwdGNoYS5u +ZXQKfHxyZWRob3RsYWJzLmNvbQp8fHJlZ2lzdHJ5Lmdvb2dsZQp8fHNhdmV0aGVk +YXRlLmZvbwp8fHNjaGVtYS5vcmcKfHxzaGF0dGVyZWQuaW8KfGh0dHA6Ly9zaXBt +bDUub3JnLwp8fHN0b3JpZXMuZ29vZ2xlCnx8c3luZXJneXNlLmNvbQp8fHRlYWNo +cGFyZW50c3RlY2gub3JnCnx8dGVuc29yZmxvdy5vcmcKfHx0aGlua3dpdGhnb29n +bGUuY29tCnx8dGlsdGJydXNoLmNvbQp8fHVyY2hpbi5jb20KIS0tfHx3d3cuZ29v +Z2xlCnx8d2F2ZXByb3RvY29sLm9yZwp8fHdheW1vLmNvbQp8fHdlYm1wcm9qZWN0 +Lm9yZwp8fHdlYnJ0Yy5vcmcKfHx3aGF0YnJvd3Nlci5vcmcKfHx3aWRldmluZS5j +b20KfHx3aXRoZ29vZ2xlLmNvbQp8fHdpdGh5b3V0dWJlLmNvbQp8fHguY29tcGFu +eQp8fHhuLS1uZ3N0ci1scmE4ai5jb20KfHx5b3V0dS5iZQoueW91dHViZS5jb20K +fHx5b3V0dWJlLmNvbQp8fHlvdXR1YmUtbm9jb29raWUuY29tCnx8eW91dHViZWVk +dWNhdGlvbi5jb20KfHx5b3V0dWJlZ2FtaW5nLmNvbQp8fHl0LmJlCnx8eXRpbWcu +Y29tCnx8enluYW1pY3MuY29tCgohIS0tLUtpY2tBU1MtLS0KIS0tT0ZGSUNJQUwg +VVJMIGxpc3QgYXQ6IGh0dHBzOi8va2FzdGF0dXMuY29tCgohIS0tLU5hdWdodHlB +bWVyaWNhLS0tCnx8bmF1Z2h0eWFtZXJpY2EuY29tCgohIS0tLU5ZVGltZXMtLS0K +IS0tfHxkMWYxZXJ5aXF5anMwci5jbG91ZGZyb250Lm5ldAohLS18fGQzbGFyMDl4 +Yndsc2dlLmNsb3VkZnJvbnQubmV0CiEtLXx8ZDNxMXFqOWp6c3U4bncuY2xvdWRm +cm9udC5uZXQKIS0tfHxkYzh4bDBuZHpuMmNiLmNsb3VkZnJvbnQubmV0CiEtLXx8 +YTEubnl0LmNvbQohLS18fGludC5ueXQuY29tCiEtLXx8czEubnl0LmNvbQpzdGF0 +aWMwMS5ueXQuY29tCiEtLXx8c3RhdGljMDEubnl0LmNvbQohLS18fHR5cGVmYWNl +Lm55dC5jb20KfHxueXQuY29tCm55dGNoaW5hLmNvbQpueXRjbi5tZQp8fG55dGNu +Lm1lCnx8bnl0Y28uY29tCnxodHRwOi8vbnl0aS5tcy8KLm55dGltZXMuY29tCnx8 +bnl0aW1lcy5jb20KfHxueXRpbWcuY29tCnVzZXJhcGkubnl0bG9nLmNvbQpjbi5u +eXRzdHlsZS5jb20KfHxueXRzdHlsZS5jb20KCiEhLS0tU3RlYW0tLS0KLnN0ZWFt +Y29tbXVuaXR5LmNvbQp8fHN0ZWFtY29tbXVuaXR5LmNvbQohLS1zdGVhbWNvbW11 +bml0eS5jb20vcHJvZmlsZXMvNzY1NjExOTgwNjI3NzE2MDkKIS0tc3RlYW1jb21t +dW5pdHkuY29tL2dyb3Vwcy9MaWJldFRpYmV0CiEtLXN0ZWFtY29tbXVuaXR5LmNv +bS9ncm91cHMvemhvbmdnb25nCiEtLXN0ZWFtY29tbXVuaXR5LmNvbS9pZC9DSlRf +SmFja3Rvbgp8aHR0cDovL3N0b3JlLnN0ZWFtcG93ZXJlZC5jb20vYXBwLzMzMzYw +MAoKISEtLS1UZWxlZ3JhbS0tLQohISEtLS1Eb21haW4tLS0KfHx0Lm1lCnx8dXBk +YXRlcy50ZGVza3RvcC5jb20KfHx0ZWxlZ3JhbS5kb2cKfHx0ZWxlZ3JhbS5tZQp8 +fHRlbGVncmFtLm9yZwoudGVsZWdyYW1kb3dubG9hZC5jb20KfHx0ZWxlc2NvLnBl +CiEhIS0tLUlQLS0tCgohIS0tLVR3aXR0ZXItLS0KfHxwZXJpc2NvcGUudHYKLnBz +Y3AudHYKfHxwc2NwLnR2Ci50LmNvCnx8dC5jbwoudHdlZXRkZWNrLmNvbQp8fHR3 +ZWV0ZGVjay5jb20KfHx0d2ltZy5jb20KLnR3aXRwaWMuY29tCnx8dHdpdHBpYy5j +b20KLnR3aXR0ZXIuY29tCnx8dHdpdHRlci5jb20KfHx0d2l0dGVyLmpwCnx8dmlu +ZS5jbwoKISEtLS1UYWl3YW4tLS0KfHxnb3YudGFpcGVpCi5nb3YudHcKfGh0dHBz +Oi8vYWlzcy5hbndzLmdvdi50dwp8fGFyY2hpdmVzLmdvdi50dwp8fHRhY2MuY3di +Lmdvdi50dwp8fGRhdGEuZ292LnR3Cnx8ZXBhLmdvdi50dwp8fGZhLmdvdi50dwp8 +fGZkYS5nb3YudHcKfHxocGEuZ292LnR3Cnx8aW1taWdyYXRpb24uZ292LnR3Cnx8 +aXRhaXdhbi5nb3YudHcKfHxtamliLmdvdi50dwp8fG1vZWFpYy5nb3YudHcKfHxt +b2wuZ292LnR3Cnx8bXZkaXMuZ292LnR3Cnx8bmF0Lmdvdi50dwp8fG5oaS5nb3Yu +dHcKfHxucGEuZ292LnR3Cnx8bnNjLmdvdi50dwp8fG50YmsuZ292LnR3Cnx8bnRi +bmEuZ292LnR3Cnx8bnRidC5nb3YudHcKfHxudHNuYS5nb3YudHcKfHxwY2MuZ292 +LnR3Cnx8c3RhdC5nb3YudHcKfHx0YWlwZWkuZ292LnR3Cnx8dGFpd2Fuam9icy5n +b3YudHcKfHx0aGIuZ292LnR3Cnx8dGlwby5nb3YudHcKfHx3ZGEuZ292LnR3CgpA +QHx8YWZ0eWdoLmdvdi50dwpAQHx8YWlkZS5nb3YudHcKQEB8fHRwZGUuYWlkZS5n +b3YudHcKQEB8fGFydGUuZ292LnR3CkBAfHxjaHVrdWFuZy5nb3YudHcKQEB8fGN3 +Yi5nb3YudHcKQEB8fGN5Y2FiLmdvdi50dwpAQHx8ZGJuc2EuZ292LnR3CkBAfHxk +Zi5nb3YudHcKQEB8fGVhc3Rjb2FzdC1uc2EuZ292LnR3CkBAfHxlcnYtbnNhLmdv +di50dwpAQHx8Z3JiLmdvdi50dwpAQHx8Z3lzZC5ueWMuZ292LnR3CkBAfHxoY2hj +Yy5nb3YudHcKQEB8fGhzaW5jaHUtY2MuZ292LnR3CkBAfHxpbmVyLmdvdi50dwpA +QHx8a2xzaW8uZ292LnR3CkBAfHxrbXNlaC5nb3YudHcKQEB8fGx1bmd0YW5oci5n +b3YudHcKQEB8fG1hb2xpbi1uc2EuZ292LnR3CkBAfHxtYXRzdS1uZXdzLmdvdi50 +dwpAQHx8bWF0c3UtbnNhLmdvdi50dwpAQHx8bWF0c3VjYy5nb3YudHcKQEB8fG1v +ZS5nb3YudHcKQEB8fG12ZGlzLmdvdi50dwpAQHx8bmFua2FuLmdvdi50dwpAQHx8 +bmNyZWUuZ292LnR3CkBAfHxuZWNvYXN0LW5zYS5nb3YudHcKQEB8fHNpcmF5YS1u +c2EuZ292LnR3CkBAfHxjcm9tb3RjLm5hdC5nb3YudHcKQEB8fHRheC5uYXQuZ292 +LnR3CkBAfHxuZWNvYXN0LW5zYS5nb3YudHcKQEB8fG5lci5nb3YudHcKQEB8fG5t +bWJhLmdvdi50dwpAQHx8bm1wLmdvdi50dwpAQHx8bm12dHRjLmdvdi50dwpAQHx8 +bm9ydGhndWFuLW5zYS5nb3YudHcKQEB8fG5wbS5nb3YudHcKQEB8fG5zdG0uZ292 +LnR3CkBAfHxudGRtaC5nb3YudHcKQEB8fG50bC5nb3YudHcKQEB8fG50c2VjLmdv +di50dwpAQHx8bnR1aC5nb3YudHcKQEB8fG52cmkuZ292LnR3CkBAfHxwZW5naHUt +bnNhLmdvdi50dwpAQHx8cG9zdC5nb3YudHcKQEB8fHNpcmF5YS1uc2EuZ292LnR3 +CkBAfHxzdGR0aW1lLmdvdi50dwpAQHx8c3VubW9vbmxha2UuZ292LnR3CkBAfHx0 +YWl0dW5nLWhvdXNlLmdvdi50dwpAQHx8dGFveXVhbi5nb3YudHcKQEB8fHRwaGNj +Lmdvdi50dwpAQHx8dHJpbXQtbnNhLmdvdi50dwpAQHx8dmdodHBlLmdvdi50dwpA +QHx8dmdoa3MuZ292LnR3CkBAfHx2Z2h0Yy5nb3YudHcKQEB8fHdhbmZhbmcuZ292 +LnR3CkBAfHx5YXRzZW4uZ292LnR3CkBAfHx5ZGEuZ292LnR3CgohLS1AQHx8NHBw +cGMuZ292LnR3CiEtLUBAfHw5MjEuZ292LnR3CiEtLUBAfHxkbXRpcC5nb3YudHcK +IS0tQEB8fGV0cmFpbmluZy5nb3YudHcKIS0tQEB8fGdzbi1jZXJ0Lm5hdC5nb3Yu +dHcKIS0tQEB8fG5pY2kubmF0Lmdvdi50dwohLS1AQHx8aGNjLmdvdi50dwohLS1A +QHx8aGVuZ2NodWVuLmdvdi50dwohLS1AQHx8a2hjYy5nb3YudHcKIS0tQEB8fGto +bXMuZ292LnR3CiEtLUBAfHxray5nb3YudHcKIS0tQEB8fGtsY2NhYi5nb3YudHcK +IS0tQEB8fGtscmEuZ292LnR3CiEtLUBAfHxubWguZ292LnR3CiEtLUBAfHxubXRs +Lmdvdi50dwohLS1AQHx8cGFicC5nb3YudHcKIS0tQEB8fHBldC5nb3YudHcKIS0t +QEB8fHRjaGIuZ292LnR3CiEtLUBAfHx0Y3NhYy5nb3YudHcKIS0tQEB8fHRuY3Nl +Yy5nb3YudHcKfHxraW5tZW4ub3JnLnR3CgohIS0tLVYyRVgtLS0KLnYyZXguY29t +CiEtLUluY2x1ZGVkIGluIGFib3ZlIHJ1bGU6IGRucy52MmV4LmNvbQpAQHxodHRw +Oi8vdjJleC5jb20KQEB8aHR0cDovL2Nkbi52MmV4LmNvbQpAQHxodHRwOi8vY24u +djJleC5jb20KQEB8aHR0cDovL2hrLnYyZXguY29tCkBAfGh0dHA6Ly9pLnYyZXgu +Y29tCkBAfGh0dHA6Ly9sYXgudjJleC5jb20KQEB8aHR0cDovL25ldWUudjJleC5j +b20KQEB8aHR0cDovL3BhZ2VzcGVlZC52MmV4LmNvbQpAQHxodHRwOi8vc3RhdGlj +LnYyZXguY29tCkBAfGh0dHA6Ly93b3Jrc3BhY2UudjJleC5jb20KQEB8aHR0cDov +L3d3dy52MmV4LmNvbQoKISEtLS1ZYWhvby0tLQp8fGRhdGEuZmx1cnJ5LmNvbQpw +YWdlLmJpZC55YWhvby5jb20KdHcuYmlkLnlhaG9vLmNvbQp8aHR0cHM6Ly90dy5i +aWQueWFob28uY29tCmJsb2dzLnlhaG9vLmNvLmpwCnx8c2VhcmNoLnlhaG9vLmNv +LmpwCmJ1eS55YWhvby5jb20udHcvZ2RzYWxlCmhrLnlhaG9vLmNvbQpoay5rbm93 +bGVkZ2UueWFob28uY29tCnR3Lm1vbmV5LnlhaG9vLmNvbQpoay5teWJsb2cueWFo +b28uY29tCm5ld3MueWFob28uY29tL2NoaW5hLWJsb2Nrcy1iYmMKfHxoay5uZXdz +LnlhaG9vLmNvbQpoay5yZC55YWhvby5jb20KaGsuc2VhcmNoLnlhaG9vLmNvbS9z +ZWFyY2gKaGsudmlkZW8ubmV3cy55YWhvby5jb20vdmlkZW8KbWVtZS55YWhvby5j +b20KIS0tdHcueWFob28uY29tCnR3LmFuc3dlcnMueWFob28uY29tCnxodHRwczov +L3R3LmFuc3dlcnMueWFob28uY29tCnx8dHcua25vd2xlZGdlLnlhaG9vLmNvbQp8 +fHR3Lm1hbGwueWFob28uY29tCnR3LnlhaG9vLmNvbQp8fHR3Lm1vYmkueWFob28u +Y29tCnR3Lm15YmxvZy55YWhvby5jb20KfHx0dy5uZXdzLnlhaG9vLmNvbQpwdWxz +ZS55YWhvby5jb20KdXBjb21pbmcueWFob28uY29tCnZpZGVvLnlhaG9vLmNvbQp8 +fHlhaG9vLmNvbS5oawp8fGR1Y2tkdWNrZ28tb3duZWQtc2VydmVyLnlhaG9vLm5l +dAoKIS0tLS0tLS0tLS0tLS0tLS0tLU51bWVyaWNzLS0tLS0tLS0tLS0tLS0tLS0t +LS0tCi4wMzBidXkuY29tCi4wcnoudHcKfGh0dHA6Ly8wcnoudHcKMS1hcHBsZS5j +b20udHcKfHwxLWFwcGxlLmNvbS50dwouMTAudHQKLjEwMGtlLm9yZwouMTAwMGdp +cmkubmV0Cnx8MTAwMGdpcmkubmV0Ci4xMGNvbmRpdGlvbnNvZmxvdmUuY29tCnx8 +MTBtdXN1bWUuY29tCjEyM3JmLmNvbQouMTJiZXQuY29tCnx8MTJiZXQuY29tCi4x +MnZwbi5jb20KLjEydnBuLm5ldAp8fDEydnBuLmNvbQp8fDEydnBuLm5ldAoxNDFo +b25na29uZy5jb20vZm9ydW0KfHwxNDFqai5jb20KLjE0MXR1YmUuY29tCi4xNjg4 +LmNvbS5hdQouMTczbmcuY29tCnx8MTczbmcuY29tCi4xNzdwaWMuaW5mbwouMTd0 +MTdwLmNvbQp8fDE4Ym9hcmQuY29tCnx8MThib2FyZC5pbmZvCjE4b25seWdpcmxz +LmNvbQouMThwMnAuY29tCi4xOHZpcmdpbnNleC5jb20KLjE5NDllci5vcmcKemhh +by4xOTg0LmNpdHkKfHx6aGFvLjE5ODQuY2l0eQoxOTg0YmJzLmNvbQp8fDE5ODRi +YnMuY29tCiEtLXx8MTk4NGJsb2cuY29tCi4xOTg0YmJzLm9yZwp8fDE5ODRiYnMu +b3JnCi4xOTkxd2F5LmNvbQp8fDE5OTF3YXkuY29tCi4xOTk4Y2RwLm9yZwouMWJh +by5vcmcKfGh0dHA6Ly8xYmFvLm9yZwouMWVldy5jb20KLjFtb2JpbGUuY29tCnxo +dHRwOi8vKi4xbW9iaWxlLnR3Cnx8MXBvbmRvLnR2Ci4yLWhhbmQuaW5mbwouMjAw +MGZ1bi5jb20vYmJzCi4yMDA4eGlhbnpoYW5nLmluZm8KfHwyMDA4eGlhbnpoYW5n +LmluZm8KfHwyMDE3LmhrCjIxYW5keS5jb20vYmxvZwouMjFwcm9uLmNvbQoyMXNl +eHR1cnkuY29tCi4yMjgubmV0LnR3Cnx8MjMzYWJjLmNvbQp8fDI0aHJzLmNhCjI0 +c21pbGUub3JnCjJsaXBzdHViZS5jb20KLjJzaGFyZWQuY29tCjMwYm94ZXMuY29t +Ci4zMTVsei5jb20KfHwzMnJlZC5jb20KfHwzNnJhaW4uY29tCi4zYTVhLmNvbQoz +YXJhYnR2LmNvbQouM2JveXMyZ2lybHMuY29tCi4zcHJveHkucnUKLjNyZW4uY2EK +LjN0dWkubmV0Cnx8NGJsdWVzdG9uZXMuYml6Ci40Y2hhbi5jb20KIS0tfHw0Y2hh +bi5vcmcKLjRldmVycHJveHkuY29tCnx8NGV2ZXJwcm94eS5jb20KfHw0cmJ0di5j +b20KfHw0c2hhcmVkLmNvbQp0YWl3YW5uYXRpb24uNTB3ZWJzLmNvbQp8fDUxLmNh +Cnx8NTFqYXYub3JnCi41MWx1b2Jlbi5jb20KfHw1MWx1b2Jlbi5jb20KLjUyNzgu +Y2MKNWFpbWlrdS5jb20KNWkwMS5jb20KLjVpc290b2k1Lm9yZwouNW1hb2Rhbmcu +Y29tCnx8NjNpLmNvbQouNjRtdXNldW0ub3JnCjY0dGlhbndhbmcuY29tCjY0d2lr +aS5jb20KLjY2LmNhCjY2NmtiLmNvbQo2cGFyay5jb20KfHw2cGFyay5jb20KfHw2 +cGFya2VyLmNvbQp8fDdjYXB0dXJlLmNvbQouN2Nvdy5jb20KLjgtZC5jb20KfGh0 +dHA6Ly84LWQuY29tCjg1Y2MubmV0Ci44NWNjLnVzCnxodHRwOi8vODVjYy51cwp8 +aHR0cDovLzg1c3QuY29tCi44ODE5MDMuY29tL3BhZ2UvemgtdHcvCnx8ODgxOTAz +LmNvbQouODg4LmNvbQouODg4cG9rZXIuY29tCjg5LjY0LmNoYXJ0ZXIuY29uc3Rp +dHV0aW9uYWxpc20uc29sdXRpb25zCjg5LTY0Lm9yZwp8fDg5LTY0Lm9yZwouOG5l +d3MuY29tLnR3Ci44ejEubmV0Cnx8OHoxLm5ldAouOTAwMTcwMC5jb20KfGh0dHA6 +Ly85MDh0YWl3YW4ub3JnLwp8fDkxcG9ybi5jb20KfHw5MXZwcy5jbHViCi45MmNj +YXYuY29tCi45OTEuY29tCnxodHRwOi8vOTkxLmNvbQouOTlidGdjMDEuY29tCnx8 +OTlidGdjMDEuY29tCi45OWNuLmluZm8KfGh0dHA6Ly85OWNuLmluZm8KfHw5Ymlz +LmNvbQp8fDliaXMubmV0CgohLS0tLS0tLS0tLS0tLS0tLS0tLS1BQS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0KLnRpYmV0LmEuc2UKfGh0dHA6Ly90aWJldC5hLnNl +Cnx8YS1ub3JtYWwtZGF5LmNvbQphNS5jb20ucnUKfGh0dHA6Ly9hYW1hY2F1LmNv +bQohLS18aHR0cDovL2NkbiouYWJjLmNvbS8KLmFiYy5jb20KLmFiY2hpbmVzZS5j +b20KYWJjbGl0ZS5uZXQKfGh0dHBzOi8vd3d3LmFiY2xpdGUubmV0Ci5hYmx3YW5n +LmNvbQouYWJvbHVvd2FuZy5jb20KfHxhYm9sdW93YW5nLmNvbQouYWJvdXRnZncu +Y29tCi5hYnMuZWR1Ci5hY2NpbS5vcmcKLmFjZXJvcy1kZS1oaXNwYW5pYS5jb20K +LmFjZXZwbi5jb20KfHxhY2V2cG4uY29tCi5hY2cxOC5tZQp8aHR0cDovL2FjZzE4 +Lm1lCnx8YWNna2ouY29tCi5hY21lZGlhMzY1LmNvbQouYWNudy5jb20uYXUKYWN0 +Zm9ydGliZXQub3JnCmFjdGltZXMuY29tLmF1CmFjdGl2cG4uY29tCnx8YWN0aXZw +bi5jb20KfHxhY3Vsby51cwp8fGFkZGljdGVkdG9jb2ZmZWUuZGUKLmFkZWxhaWRl +YmJzLmNvbS9iYnMKLmFkcGwub3JnLmhrCnxodHRwOi8vYWRwbC5vcmcuaGsKLmFk +dWx0LXNleC1nYW1lcy5jb20KfHxhZHVsdC1zZXgtZ2FtZXMuY29tCmFkdWx0ZnJp +ZW5kZmluZGVyLmNvbQphZHVsdGtlZXAubmV0L3BlZXBzaG93L21lbWJlcnMvbWFp +bi5odG0KfHxhZHZhbnNjZW5lLmNvbQp8fGFkdmVydGZhbi5jb20KLmFlLm9yZwp8 +fGFlbmhhbmNlcnMuY29tCnx8YWYubWlsCi5hZmFudGliYnMuY29tCnxodHRwOi8v +YWZhbnRpYmJzLmNvbQouYWkta2FuLm5ldAp8fGFpLWthbi5uZXQKYWktd2VuLm5l +dAouYWlwaC5uZXQKfHxhaXBoLm5ldAouYWlyYXNpYS5jb20KfHxhaXJjb25zb2xl +LmNvbQp8aHR0cDovL2Rvd25sb2FkLmFpcmNyYWNrLW5nLm9yZwouYWlydnBuLm9y +Zwp8fGFpcnZwbi5vcmcKLmFpc2V4LmNvbQp8fGFpdC5vcmcudHcKYWl3ZWl3ZWku +Y29tCi5haXdlaXdlaWJsb2cuY29tCnx8YWl3ZWl3ZWlibG9nLmNvbQp8fHd3dy5h +anNhbmRzLmNvbQoKISEtLS1Ba2FtYWktLS0KfGh0dHBzOi8vZmJjZG4qLmFrYW1h +aWhkLm5ldC8KIS0tfHxmYmV4dGVybmFsLWEuYWthbWFpaGQubmV0CiEtLXx8ZmJz +dGF0aWMtYS5ha2FtYWloZC5uZXQKIS0tfGh0dHBzOi8vaWdjZG4qLmFrYW1haWhk +Lm5ldAphMjQ4LmUuYWthbWFpLm5ldAp8fGEyNDguZS5ha2FtYWkubmV0CnZvYS0x MS5ha2FjYXN0LmFrYW1haXN0cmVhbS5uZXQKCi5ha2FkZW1peWUub3JnL3VnCnxo -dHRwOi8vYWthZGVtaXllLm9yZy91Zwp8fGFraWJhLW9ubGluZS5jb20KfHxhbC1x -aW1tYWgubmV0Cnx8YWxhYm91dC5jb20KLmFsYW5ob3UuY29tCnxodHRwOi8vYWxh -bmhvdS5jb20KfHxhbGFzYmFycmljYWRhcy5vcmcKYWxleGx1ci5vcmcKfHxhbGZv -cmF0dHYubmV0Ci5hbGhheWF0LmNvbQphbGllbmd1LmNvbQp8fGFsa2FzaXIuY29t -Cnx8YWxsY29ubmVjdGVkLmNvCi5hbGxkcmF3bnNleC5jb20KfHxhbGxkcmF3bnNl -eC5jb20KfHxhbGxmaW5lZ2lybHMuY29tCmFsbGdpcmxzYWxsb3dlZC5vcmcKYWxs -aWFuY2Uub3JnLmhrCi5hbGxpbmZhLmNvbQp8aHR0cDovL2FsbGluZmEuY29tCi5h -bGxqYWNrcG90c2Nhc2luby5jb20KfHxhbGxtb3ZpZS5jb20KLmFscGhhcG9ybm8u -Y29tCnx8YWx0ZXJuYXRlLXRvb2xzLmNvbQphbHZpbmFsZXhhbmRlci5jb20KYWx3 -YXlzZGF0YS5jb20KfHxhbHdheXNkYXRhLmNvbQp8fGFsd2F5c2RhdGEubmV0Ci5h -bHdheXN2cG4uY29tCnx8YWx3YXlzdnBuLmNvbQp8fGFtNzMwLmNvbS5oawphbWF6 -b24uY29tL1ByaXNvbmVyLVN0YXRlLVNlY3JldC1Kb3VybmFsLVByZW1pZXIKYW1l -YmxvLmpwCnx8YW1lYmxvLmpwCnd3dzEuYW1lcmljYW4uZWR1L3RlZC9pY2UvdGli -ZXQKfHxhbWVyaWNhbmdyZWVuY2FyZC5jb20KfGh0dHA6Ly93d3cuYW1lcmljb3Jw -cy5nb3YKfHxhbWlibG9ja2Vkb3Jub3QuY29tCi5hbWlnb2Jicy5uZXQKLmFtaXRh -YmhhZm91bmRhdGlvbi51cwp8aHR0cDovL2FtaXRhYmhhZm91bmRhdGlvbi51cwou -YW1uZXN0eS5vcmcKfHxhbW5lc3R5Lm9yZwouYW1uZXN0eS50dwouYW1uZXN0eXVz -YS5vcmcKfHxhbW5lc3R5dXNhLm9yZwouYW1ueWVtYWNoZW4ub3JnCi5hbW9paXN0 -LmNvbQphbm5hdGFtLmNvbS9jaGluZXNlCnx8YW5jaG9yZnJlZS5jb20KIS0tR0hT -Cnx8YW5jc2NvbmYub3JnCnx8YW5kZmFyYXdheS5uZXQKfHxhbmRyb2lkLXg4Ni5v -cmcKYW5nZWxmaXJlLmNvbS9oaS9oYXlhc2hpCnx8YW5ndWxhcmpzLm9yZwphbmlt -ZWNyYXp5Lm5ldAouYW5pbWVzaGlwcHV1ZGVuLmNvbQphbmlzY2FydHVqby5jb20K -fHxhbmlzY2FydHVqby5jb20KfHxhbm9iaWkuY29tCi5hbm9ueW1pdHluZXR3b3Jr -LmNvbQp8fGFub255bWl0eW5ldHdvcmsuY29tCi5hbm9ueW1pemVyLmNvbQphbm9u -dGV4dC5jb20KLmFucG9wby5jb20KLmFuc3dlcmluZy1pc2xhbS5vcmcKfGh0dHA6 -Ly93d3cuYW50ZC5vcmcKfHxhbnRob255Y2FsemFkaWxsYS5jb20KLmFudGkxOTg0 -LmNvbQouYW50aXdhdmUubmV0CnxodHRwOi8vYW50aXdhdmUubmV0Ci5hbnlzZXgu -Y29tCnxodHRwOi8vYW55c2V4LmNvbQp8fGFvYm8uY29tLmF1Ci5hb2ZyaWVuZC5j -b20KfGh0dHA6Ly9hb2ZyaWVuZC5jb20KLmFvZnJpZW5kLmNvbS5hdQouYW9qaWFv -Lm9yZwp8fGFvbGNoYW5uZWxzLmFvbC5jb20KdmlkZW8uYW9sLmNhL3ZpZGVvLWRl -dGFpbAp2aWRlby5hb2wuY28udWsvdmlkZW8tZGV0YWlsCnZpZGVvLmFvbC5jb20K -fHx2aWRlby5hb2wuY29tCnx8c2VhcmNoLmFvbC5jb20Kd3d3LmFvbG5ld3MuY29t -Cnx8YW9taXdhbmcuY29tCnZpZGVvLmFwLm9yZwouYXBldHViZS5jb20KfHxhcGlh -cnkuaW8KLmFwaWdlZS5jb20KfHxhcGlnZWUuY29tCmFway1kbC5jb20KYXBrZGxl -ci5jb20vYXBrL3ZpZXcKLmFwcGRvd25sb2FkZXIubmV0L0FuZHJvaWQKYXBrcHVy -ZS5jb20KfHxhcGtwdXJlLmNvbQohLS18fGFwcGFubmllLmNvbQphcHBsZWRhaWx5 -LmNvbQp8fGFwcHNvY2tzLm5ldAp8fGFwcHN0by5yZQp8fGFyY2hpdmVzLmdvdgph -cmNoaXZlLmlzCnx8YXJjaGl2ZS5vcmcKLmFyY3Rvc2lhLmNvbQp8aHR0cDovL2Fy -Y3Rvc2lhLmNvbQp8fGFyZWNhLWJhY2t1cC5vcmcKLmFyZXRodXNhLnN1Cnx8YXJl -dGh1c2Euc3UKfHxhcmxpbmd0b25jZW1ldGVyeS5taWwKfHxhcm15Lm1pbAp8fGFy -c3RlY2huaWNhLmNvbQouYXJ0NHRpYmV0MTk5OC5vcmcKYXJ0b2ZwZWFjZWZvdW5k -YXRpb24ub3JnCmFydHN5Lm5ldAp8fGFzYWNwLm9yZwouYXNhaGljaGluZXNlLmNv -bQp8fGFzYWhpY2hpbmVzZS5jb20KYXNkZmcuanAvZGFicgphc2cudG8KLmFzaWEt -Z2FtaW5nLmNvbQouYXNpYWhhcnZlc3Qub3JnCnx8YXNpYWhhcnZlc3Qub3JnCmFz -aWFuZXdzLml0CnxodHRwOi8vamFwYW5maXJzdC5hc2lhbmZyZWVmb3J1bS5jb20v -Cnx8YXNpYW5zZXhkaWFyeS5jb20KfHxhc2lhbndvbWVuc2ZpbG0uZGUKLmFzaWF0 -Z3AuY29tCnx8YXNrc3R1ZGVudC5jb20KLmFza3luei5uZXQKfHxhc2t5bnoubmV0 -Cnx8YXNzZW1ibGEuY29tCnx8YXN0b25tYXJ0aW5uZXdzLmNvbQp8fGFzdHJpbGwu -Y29tCnx8YXRjLm9yZy5hdQouYXRjaGluZXNlLmNvbQp8aHR0cDovL2F0Y2hpbmVz -ZS5jb20KYXRnZncub3JnCnx8YXRqLm9yZy50dwouYXRsYXNwb3N0LmNvbQp8fGF0 -bGFzcG9zdC5jb20KfHxhdGRtdC5jb20KLmF0bmV4dC5jb20KfHxhdG5leHQuY29t -CmF2YWF6Lm9yZwp8fGF2YWF6Lm9yZwohLS18fGF2YXN0LmNvbQouYXZjaXR5LnR2 -Ci5hdmNvb2wuY29tCi5hdmRiLmluCnx8YXZkYi5pbgouYXZkYi50dgp8fGF2ZGIu -dHYKLmF2ZmFudGFzeS5jb20KfHxhdmlkZW11eC5vcmcKfHxhdm9pc2lvbi5jb20K -LmF2eWFob28uY29tCnx8YXh1cmVmb3JtYWMuY29tCi5hemVyYmF5Y2FuLnR2CmF6 -ZXJpbWl4LmNvbQohLS1ib3h1bi5henVyZXdlYnNpdGVzLm5ldCBkb2Vzbid0IGV4 -aXN0Lgpib3h1biouYXp1cmV3ZWJzaXRlcy5uZXQKfHxib3h1biouYXp1cmV3ZWJz -aXRlcy5uZXQKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLUJCLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLQpmb3J1bS5iYWJ5LWtpbmdkb20uY29tCmJhYnluZXQuY29tLmhr -CmJhY2tjaGluYS5jb20KfHxiYWNrY2hpbmEuY29tCi5iYWNrcGFja2Vycy5jb20u -dHcvZm9ydW0KYmFja3RvdGlhbmFubWVuLmNvbQouYmFkam9qby5jb20KYmFkb28u -Y29tCnxodHRwOi8vKjIuYmFoYW11dC5jb20udHcKfHxiYWlkdS5qcAp8fGJhaWxh -bmRhaWx5LmNvbQp8fGJhaXhpbmcubWUKfHxiYWtnZWVraG9tZS50awouYmFuYW5h -LXZwbi5jb20KfHxiYW5hbmEtdnBuLmNvbQouYmFuZHdhZ29uaG9zdC5jb20KfHxi -YW5kd2Fnb25ob3N0LmNvbQouYmFuZ2Jyb3NuZXR3b3JrLmNvbQouYmFuZ2NoZW4u -bmV0CnxodHRwOi8vYmFuZ2NoZW4ubmV0Cnx8YmFuZ3lvdWxhdGVyLmNvbQpiYW5u -ZWRib29rLm9yZwp8fGJhbm5lZGJvb2sub3JnCi5iYW5uZWRuZXdzLm9yZwouYmFy -ZW5ha2VkaXNsYW0uY29tCnx8YmFybmFidS5jby51awpiYXJ0dnBuLmNvbQpiYXl2 -b2ljZS5uZXQKfHxiYXl2b2ljZS5uZXQKZGFqdXNoYS5iYXl3b3Jkcy5jb20KfHxi -YmNoYXQudHYKfHxiYi1jaGF0LnR2Ci5iYmMuY28udWsvY2hpbmVzZQouYmJjLmNv -LnVrL25ld3Mvd29ybGQtYXNpYS1jaGluYQouYmJjLmNvLnVrL3R2Ci5iYmMuY28u -dWsvemhvbmd3ZW4KLmJiYy5jb20vdWtjaGluYQouYmJjLmNvbS96aG9uZ3dlbgpu -ZXdzLmJiYy5jby51ay9vbnRoaXNkYXkqbmV3c2lkXzI0OTYwMDAvMjQ5NjI3Nwpu -ZXdzZm9ydW1zLmJiYy5jby51awouYmJjY2hpbmVzZS5jb20KfHxiYmNjaGluZXNl -LmNvbQp8aHR0cDovL2JiYy5pbgouYmJnLmdvdgouYmJrei5jb20vZm9ydW0KLmJi -bnJhZGlvLm9yZwpiYnMtdHcuY29tCi5iYnNkaWdlc3QuY29tL3RocmVhZAp8fGJi -c2ZlZWQuY29tCmJic2xhbmQuY29tCi5iYnNtby5jb20KLmJic29uZS5jb20KYmJ0 -b3lzdG9yZS5jb20KLmJjYXN0LmNvLm56Ci5iY2MuY29tLnR3L2JvYXJkCi5iY2No -aW5lc2UubmV0Ci5iY21vcm5pbmcuY29tCmJkc212aWRlb3MubmV0Ci5iZWFjb25l -dmVudHMuY29tCi5iZWJvLmNvbQp8fGJlYm8uY29tCi5iZWV2cG4uY29tCnx8YmVl -dnBuLmNvbQouYmVoaW5ka2luay5jb20KfHxiZWlqaW5nMTk4OS5jb20KYmVpamlu -Z3NwcmluZy5jb20KfHxiZWlqaW5nc3ByaW5nLmNvbQouYmVsYW1pb25saW5lLmNv -bQouYmVsbC53aWtpCnxodHRwOi8vYmVsbC53aWtpCmJlbXl3aWZlLmNjCmJlcmlj -Lm1lCi5iZXJsaW50d2l0dGVyd2FsbC5jb20KfHxiZXJsaW50d2l0dGVyd2FsbC5j -b20KLmJlcm0uY28ubnoKLmJlc3Rmb3JjaGluYS5vcmcKfHxiZXN0Zm9yY2hpbmEu -b3JnCnx8YmVzdHZwbi5jb20KLmJlc3R2cG5zZXJ2ZXIuY29tCi5iZXN0dnBuc2Vy -dmljZS5jb20KLmJlc3R2cG51c2EuY29tCnx8YmV0MzY1LmNvbQouYmV0ZmFpci5j -b20KLmJldHRlcnZwbi5jb20KfHxiZXR0ZXJ2cG4uY29tCi5iZXR0d2Vlbi5jb20K -fHxiZXR0d2Vlbi5jb20KfHxiZXR2aWN0b3IuY29tCi5iZXd3dy5uZXQKLmJleW9u -ZGZpcmV3YWxsLmNvbQp8fGJmbm4ub3JnCnx8YmZzaC5oawouYmd2cG4uY29tCnx8 -Ymd2cG4uY29tCmJpYW50YWlsYWppYW8uY29tCmJpYW50YWlsYWppYW8uaW4KLmJp -Ymxlc2ZvcmFtZXJpY2Eub3JnCnxodHRwOi8vYmlibGVzZm9yYW1lcmljYS5vcmcK -LmJpYzIwMTEub3JnCmJpZ2Zvb2xzLmNvbQp8fGJpZ2phcGFuZXNlc2V4LmNvbQou -YmlnbmV3cy5vcmcKfHxiaWduZXdzLm9yZwouYmlnc291bmQub3JnCnxodHRwOi8v -YmlsbHlwYW4uY29tL3dpa2kKfHxiaWxseXdyLmNvbQpiaXBpYy5uZXQKLmJpdC5k -bwp8aHR0cDovL2JpdC5kbwouYml0Lmx5CnxodHRwOi8vYml0Lmx5CiEtLXx8Yml0 -YnVja2V0Lm9yZwp8fGJpdGNvaW50YWxrLm9yZwouYml0c2hhcmUuY29tCnx8Yml0 -c2hhcmUuY29tCmJpdHNub29wLmNvbQpiaXpoYXQuY29tCnx8YmwtZG91amluc291 -a28uY29tCi5iam5ld2xpZmUub3JnCi5ianMub3JnCmJqemMub3JnCnx8Ymp6Yy5v -cmcKLmJsYWNrbG9naWMuY29tCi5ibGFja3Zwbi5jb20KfHxibGFja3Zwbi5jb20K -dG9yLmJsaW5nYmxpbmdzcXVhZC5uZXQKLmJsaW5reC5jb20KfHxibGlua3guY29t -CmJsaW53LmNvbQouYmxpcC50dgp8fGJsaXAudHYvCi5ibG9ja2NuLmNvbQp8fGJs -b2NrY24uY29tCnx8YmxvZy5kZQouYmxvZy5qcAp8aHR0cDovL2Jsb2cuanAKfHxi -bG9nYmxvZy5jb20KLmJsb2djYXRhbG9nLmNvbQp8fGJsb2djYXRhbG9nLmNvbQp8 -fGJsb2djaXR5Lm1lCi5ibG9nZ2VyLmNvbQp8fGJsb2dnZXIuY29tCmJsb2dpbWcu -anAKfHxibG9nLmthbmd5ZS5vcmcKLmJsb2dsaW5lcy5jb20KfHxibG9nbGluZXMu -Y29tCnx8YmxvZ2xvdmluLmNvbQpyY29udmVyc2F0aW9uLmJsb2dzLmNvbQpibG9n -dGQubmV0Ci5ibG9ndGQub3JnCnxodHRwOi8vYmxvZ3RkLm9yZwp8fGJsb29kc2hl -ZC5uZXQKLmJsb29tYmVyZy5jbgp8fGJsb29tYmVyZy5jbgouYmxvb21iZXJnLmNv -bQp8fGJsb29tYmVyZy5jb20KYmxvb21iZXJnLmRlCnx8Ymxvb21iZXJnLmRlCnx8 -Ymxvb21mb3J0dW5lLmNvbQpibHVlYW5nZWxsaXZlLmNvbQouYm1maW5uLmNvbQp8 -fGJucm1ldGFsLmNvbQpib2FyZHJlYWRlci5jb20vdGhyZWFkCnx8Ym9hcmRyZWFk -ZXIuY29tCi5ib2QuYXNpYQp8aHR0cDovL2JvZC5hc2lhCi5ib2RvZzg4LmNvbQou -Ym9sZWh2cG4ubmV0Cnx8Ym9sZWh2cG4ubmV0CmJvbmJvbm1lLmNvbQouYm9uYm9u -c2V4LmNvbQouYm9uZm91bmRhdGlvbi5vcmcKLmJvbmdhY2Ftcy5jb20KfHxib29i -c3RhZ3JhbS5jb20KfHxib29rLmNvbS50dwpib29rZXB1Yi5jb20KfHxib29rcy5j -b20udHcKfHxib3RhbndhbmcuY29tCi5ib3QubnUKLmJvd2VucHJlc3MuY29tCnx8 -Ym93ZW5wcmVzcy5jb20KfHxhcHAuYm94LmNvbQpkbC5ib3gubmV0Cnx8ZGwuYm94 -Lm5ldAouYm94cG4uY29tCnx8Ym94cG4uY29tCmJveHVuLmNvbQp8fGJveHVuLmNv -bQouYm94dW4udHYKfHxib3h1bi50dgpib3h1bmJsb2cuY29tCnx8Ym94dW5ibG9n -LmNvbQouYm94dW5jbHViLmNvbQpib3lhbmd1LmNvbQouYm95ZnJpZW5kdHYuY29t -Ci5ib3lzZm9vZC5jb20KfHxici5zdAouYnJhaW55cXVvdGUuY29tL3F1b3Rlcy9h -dXRob3JzL2QvZGFsYWlfbGFtYQp8fGJyYW5kb25odXRjaGluc29uLmNvbQp8fGJy -YXVtZWlzdGVyLm9yZwouYnJhdm90dWJlLm5ldAp8fGJyYXZvdHViZS5uZXQKLmJy -YXp6ZXJzLmNvbQp8fGJyYXp6ZXJzLmNvbQouYnJlYWsuY29tCnx8YnJlYWsuY29t -CmJyZWFrZ2Z3LmNvbQouYnJlYWtpbmd0d2VldHMuY29tCnx8YnJlYWtpbmd0d2Vl -dHMuY29tCnx8YnJlYWt3YWxsLm5ldApicmlpYW4uY29tLzY1MTEvZnJlZWdhdGUK -LmJyaWVmZHJlYW0uY29tLyVFNyVCNCVBMCVFNiVBMyVCQQpicml6emx5LmNvbQp8 -fGJyaXp6bHkuY29tCmJyb2FkYm9vay5jb20KLmJyb2FkcHJlc3NpbmMuY29tCnx8 -YnJvYWRwcmVzc2luYy5jb20KYmJzLmJyb2NrYmJzLmNvbQpicnVjZXdhbmcubmV0 -Ci5icnV0YWx0Z3AuY29tCnx8YnJ1dGFsdGdwLmNvbQouYnQybWFnLmNvbQp8fGJ0 -OTUuY29tCi5idGFpYS5jb20KfGh0dHA6Ly9idGRpZ2cub3JnCi5idGt1Lm1lCnx8 -YnRrdS5tZQp8fGJ0a3Uub3JnCi5idHNwcmVhZC5jb20KLmJ1ZGFlZHUub3JnCnx8 -YnVkYWVkdS5vcmcKLmJ1ZGRoaXN0Y2hhbm5lbC50dgouYnVmZmVyZWQuY29tCnxo -dHRwOi8vYnVmZmVyZWQuY29tCi5idWxsb2cub3JnCnx8YnVsbG9nLm9yZwouYnVs -bG9nZ2VyLmNvbQp8fGJ1bGxvZ2dlci5jb20KYnVuYnVuaGsuY29tCi5idXNheWFy -aS5jb20KfGh0dHA6Ly9idXNheWFyaS5jb20KLmJ1c2luZXNzaW5zaWRlci5jb20v -YmluZy1jb3VsZC1iZS1jZW5zb3Jpbmctc2VhcmNoLXJlc3VsdHMtMjAxNAouYnVz -aW5lc3NpbnNpZGVyLmNvbS9jaGluYS1iYW5rcy1wcmVwYXJpbmctZm9yLWRlYnQt -aW1wbG9zaW9uLTIwMTQKLmJ1c2luZXNzaW5zaWRlci5jb20vaG9uZy1rb25nLWFj -dGl2aXN0cy1kZWZ5LXBvbGljZS10ZWFyLWdhcy1hcy1wcm90ZXN0cy1jb250aW51 -ZS1vdmVybmlnaHQtMjAxNAouYnVzaW5lc3NpbnNpZGVyLmNvbS9pbnRlcm5ldC1v -dXRhZ2VzLXJlcG9ydGVkLWluLW5vcnRoLWtvcmVhLTIwMTQKLmJ1c2luZXNzaW5z -aWRlci5jb20vaXBob25lLTYtaXMtYXBwcm92ZWQtZm9yLXNhbGUtaW4tY2hpbmEt -MjAxNAouYnVzaW5lc3NpbnNpZGVyLmNvbS9uZmwtYW5ub3VuY2Vycy1zdXJmYWNl -LXRhYmxldHMtMjAxNAouYnVzaW5lc3NpbnNpZGVyLmNvbS91bWJyZWxsYS1tYW4t -aG9uZy1rb25nLTIwMTQKfGh0dHA6Ly9zdGF0aWMqLmJ1c2luZXNzaW5zaWRlci5j -b20vCnxodHRwOi8vd3d3LmJ1c2luZXNzaW5zaWRlci5jb20uYXUvKgouYnVzaW5l -c3N3ZWVrLmNvbQouYnVzdS5vcmcvbmV3cwp8aHR0cDovL2J1c3Uub3JnL25ld3MK -YnVzeXRyYWRlLmNvbQouYnV1Z2FhLmNvbQouYnV6emhhbmQuY29tCi5idXp6aGFu -ZC5uZXQKLmJ1enpvcmFuZ2UuY29tCnx8YnV6em9yYW5nZS5jb20KYndzai5oawp8 -fGJ4LnRsCmhvbHouYnlldGhvc3Q4LmNvbQoKIS0tLS0tLS0tLS0tLS0tLS0tLS0t -Q0MtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi5jLXNwYW52aWRlby5vcmcKfHxj -LXNwYW52aWRlby5vcmcKfHxjLWVzdC1zaW1wbGUuY29tCi5jMTAwdGliZXQub3Jn -Cnx8Y2FibGVnYXRlc2VhcmNoLm5ldAouY2FjaGluZXNlLmNvbQouY2FjbncuY29t -CnxodHRwOi8vY2FjbncuY29tCi5jYWN0dXN2cG4uY29tCnx8Y2FjdHVzdnBuLmNv -bQouY2FmZXByZXNzLmNvbQouY2Foci5vcmcudHcKLmNhbGFtZW8uY29tL2Jvb2tz -CmNuLmNhbGFtZW8uY29tCnxodHRwOi8vY24uY2FsYW1lby5jb20KLmNhbGdhcnlj -aGluZXNlLmNhCi5jYWxnYXJ5Y2hpbmVzZS5jb20KLmNhbGdhcnljaGluZXNlLm5l -dAp8aHR0cDovL2Jsb2cuY2FsaWJyZS1lYm9vay5jb20KZmFsdW4uY2FsdGVjaC5l -ZHUKLml0cy5jYWx0ZWNoLmVkdS9+ZmFsdW4vCi5jYW00LmNvbQouY2FtNC5qcAou -Y2FtNC5zZwouY2FtZnJvZy5jb20KfHxjYW1mcm9nLmNvbQp8fGNhbXMuY29tCi5j -YW1zLm9yZy5zZwpjYW5hZGFtZWV0LmNvbQp8aHR0cDovL2Jicy5jYW50b25lc2Uu -YXNpYS8KIS0taHR0cDovL3d3dy5jYW50b25lc2UuYXNpYS9hY3Rpb24tYmJzLmh0 -bWwKLmNhbnl1Lm9yZwp8aHR0cDovL2Nhbnl1Lm9yZwouY2FvLmltCi5jYW9iaWFu -LmluZm8KfHxjYW9iaWFuLmluZm8KY2FvY2hhbmdxaW5nLmNvbQp8fGNhb2NoYW5n -cWluZy5jb20KLmNhcC5vcmcuaGsKfHxjYXAub3JnLmhrCi5jYXJhYmluYXN5cGlz -dG9sYXMuY29tCmNhcmRpbmFsa3VuZ2ZvdW5kYXRpb24ub3JnCmNhcm1vdG9yc2hv -dy5jb20KLmNhcnRvb25tb3ZlbWVudC5jb20KLmNhc2FkZWx0aWJldGJjbi5vcmcK -LmNhc2F0aWJldC5vcmcubXgKfGh0dHA6Ly9jYXNhdGliZXQub3JnLm14CmNhcmku -Y29tLm15Cnx8Y2FyaWJiZWFuY29tLmNvbQouY2FzaW5va2luZy5jb20KLmNhc2lu -b3JpdmEuY29tCnx8Y2F0Y2gyMi5uZXQKfHxjYXRmaWdodHBheXBlcnZpZXcueHh4 -Ci5jYXRob2xpYy5vcmcuaGsKfHxjYXRob2xpYy5vcmcuaGsKY2F0aG9saWMub3Jn -LnR3Cnx8Y2F0aG9saWMub3JnLnR3Ci5jYXRodm9pY2Uub3JnLnR3Cnx8Y2F0dHQu -Y29tCi5jYmMuY2EKfHxjYmMuY2EKLmNic25ld3MuY29tL3ZpZGVvCi5jYnRjLm9y -Zy5oawohLS5jY2MuZGUKIS18fGNjYy5kZQp8fGNjY2F0LmNjCi5jY2R0ci5vcmcK -fHxjY2R0ci5vcmcKLmNjaGVyZS5jb20KfHxjY2hlcmUuY29tCi5jY2ltLm9yZwou -Y2NsaWZlLmNhCmNjbGlmZS5vcmcKY2NsaWZlZmwub3JnCi5jY3RoZXJlLmNvbQp8 -fGNjdGhlcmUuY29tCi5jY3RvbmdiYW8uY29tL2FydGljbGUvMjA3ODczMgpjY3Vl -LmNhCmNjdWUuY29tCi5jY3ZvaWNlLmNhCi5jY3cub3JnLnR3Ci5jZ2RlcG90Lm9y -Zwp8aHR0cDovL2NnZGVwb3Qub3JnCnx8Y2Rib29rLm9yZwp8fGNkZC5tZQouY2Rl +dHRwOi8vYWthZGVtaXllLm9yZy91Zwp8fGFraWJhLW9ubGluZS5jb20KfHxha293 +Lm9yZwouYWwtaXNsYW0uY29tCnx8YWwtcWltbWFoLm5ldAp8fGFsYWJvdXQuY29t +Ci5hbGFuaG91LmNvbQp8aHR0cDovL2FsYW5ob3UuY29tCi5hbGFyYWIucWEKfHxh +bGFzYmFycmljYWRhcy5vcmcKYWxleGx1ci5vcmcKfHxhbGZvcmF0dHYubmV0Ci5h +bGhheWF0LmNvbQouYWxpY2VqYXBhbi5jby5qcAphbGllbmd1LmNvbQp8fGFsa2Fz +aXIuY29tCnx8YWxsY29ubmVjdGVkLmNvCi5hbGxkcmF3bnNleC5jb20KfHxhbGxk +cmF3bnNleC5jb20KLmFsbGVydnBuLmNvbQp8fGFsbGZpbmVnaXJscy5jb20KLmFs +bGdpcmxtYXNzYWdlLmNvbQphbGxnaXJsc2FsbG93ZWQub3JnCi5hbGxncmF2dXJl +LmNvbQphbGxpYW5jZS5vcmcuaGsKLmFsbGluZmEuY29tCnxodHRwOi8vYWxsaW5m +YS5jb20KLmFsbGphY2twb3RzY2FzaW5vLmNvbQp8fGFsbG1vdmllLmNvbQp8fGFs +bWFzZGFybmV3cy5jb20KLmFscGhhcG9ybm8uY29tCnx8YWx0ZXJuYXRlLXRvb2xz +LmNvbQphbHRlcm5hdGl2ZXRvLm5ldC9zb2Z0d2FyZQphbHZpbmFsZXhhbmRlci5j +b20KYWx3YXlzZGF0YS5jb20KfHxhbHdheXNkYXRhLmNvbQp8fGFsd2F5c2RhdGEu +bmV0Ci5hbHdheXN2cG4uY29tCnx8YWx3YXlzdnBuLmNvbQp8fGFtNzMwLmNvbS5o +awphbWF6b24uY29tL1ByaXNvbmVyLVN0YXRlLVNlY3JldC1Kb3VybmFsLVByZW1p +ZXIKYW1lYmxvLmpwCnx8YW1lYmxvLmpwCnd3dzEuYW1lcmljYW4uZWR1L3RlZC9p +Y2UvdGliZXQKfHxhbWVyaWNhbmdyZWVuY2FyZC5jb20KfGh0dHA6Ly93d3cuYW1l +cmljb3Jwcy5nb3YKfHxhbWlibG9ja2Vkb3Jub3QuY29tCi5hbWlnb2Jicy5uZXQK +LmFtaXRhYmhhZm91bmRhdGlvbi51cwp8aHR0cDovL2FtaXRhYmhhZm91bmRhdGlv +bi51cwouYW1uZXN0eS5vcmcKfHxhbW5lc3R5Lm9yZwp8fGFtbmVzdHkub3JnLmhr +Ci5hbW5lc3R5LnR3Ci5hbW5lc3R5dXNhLm9yZwp8fGFtbmVzdHl1c2Eub3JnCi5h +bW55ZW1hY2hlbi5vcmcKLmFtb2lpc3QuY29tCi5hbXRiLXRhaXBlaS5vcmcKYW5k +cm9pZHBsdXMuY28vYXBrCi5hbmR5Z29kLmNvbQp8aHR0cDovL2FuZHlnb2QuY29t +CmFubmF0YW0uY29tL2NoaW5lc2UKfHxhbmNob3JmcmVlLmNvbQohLS1HSFMKfHxh +bmNzY29uZi5vcmcKfHxhbmRmYXJhd2F5Lm5ldAp8fGFuZHJvaWQteDg2Lm9yZwph +bmdlbGZpcmUuY29tL2hpL2hheWFzaGkKfHxhbmd1bGFyanMub3JnCmFuaW1lY3Jh +enkubmV0Ci5hbmltZXNoaXBwdXVkZW4uY29tCmFuaXNjYXJ0dWpvLmNvbQp8fGFu +aXNjYXJ0dWpvLmNvbQp8fGFub2JpaS5jb20KYW5vbnltaXNlLnVzCi5hbm9ueW1p +dHluZXR3b3JrLmNvbQouYW5vbnltaXplci5jb20KYW5vbnRleHQuY29tCi5hbnBv +cG8uY29tCi5hbnN3ZXJpbmctaXNsYW0ub3JnCnxodHRwOi8vd3d3LmFudGQub3Jn +Cnx8YW50aG9ueWNhbHphZGlsbGEuY29tCi5hbnRpMTk4NC5jb20KYW50aWNocmlz +dGVuZG9tLmNvbQouYW50aXdhdmUubmV0CnxodHRwOi8vYW50aXdhdmUubmV0Ci5h +bnlwb3JuLmNvbQouYW55c2V4LmNvbQp8aHR0cDovL2FueXNleC5jb20KfHxhb2Jv +LmNvbS5hdQouYW9mcmllbmQuY29tCnxodHRwOi8vYW9mcmllbmQuY29tCi5hb2Zy +aWVuZC5jb20uYXUKLmFvamlhby5vcmcKfHxhb21pd2FuZy5jb20KdmlkZW8uYXAu +b3JnCi5hcGV0dWJlLmNvbQp8fGFwaWFyeS5pbwouYXBpZ2VlLmNvbQp8fGFwaWdl +ZS5jb20KYXBrLWRsLmNvbQphcGtkbGVyLmNvbS9hcGsvdmlldwouYXBrbW9uay5j +b20vYXBwCnx8YXBrcGx6LmNvbQphcGtwdXJlLmNvbQp8fGFwa3B1cmUuY29tCi5h +cGx1c3Zwbi5jb20KIS0tfHxhcHBhbm5pZS5jb20KLmFwcGRvd25sb2FkZXIubmV0 +L0FuZHJvaWQKLmFwcGxlZGFpbHkuY29tCnx8YXBwbGVkYWlseS5jb20KLmFwcHNo +b3BwZXIuY29tCnxodHRwOi8vYXBwc2hvcHBlci5jb20KfHxhcHBzb2Nrcy5uZXQK +fHxhcHBzdG8ucmUKfHxhcmNoaXZlcy5nb3YKLmFyY2hpdmUuZm8KLmFyY2hpdmUu +aXMKfHxhcmNoaXZlLmlzCi5hcmNoaXZlLmxpCnxodHRwczovL2FyY2hpdmUubGkK +fHxhcmNoaXZlLm9yZwphcmNoaXZlLnRvZGF5CnxodHRwczovL2FyY2hpdmUudG9k +YXkKLmFyY3Rvc2lhLmNvbQp8aHR0cDovL2FyY3Rvc2lhLmNvbQp8fGFyZWNhLWJh +Y2t1cC5vcmcKLmFyZXRodXNhLnN1Cnx8YXJldGh1c2Euc3UKfHxhcmxpbmd0b25j +ZW1ldGVyeS5taWwKfHxhcm15Lm1pbAouYXJ0NHRpYmV0MTk5OC5vcmcKYXJ0b2Zw +ZWFjZWZvdW5kYXRpb24ub3JnCmFydHN5Lm5ldAp8fGFzYWNwLm9yZwouYXNhaGlj +aGluZXNlLmNvbQp8fGFzYWhpY2hpbmVzZS5jb20KYXNkZmcuanAvZGFicgphc2cu +dG8KLmFzaWEtZ2FtaW5nLmNvbQouYXNpYWhhcnZlc3Qub3JnCnx8YXNpYWhhcnZl +c3Qub3JnCmFzaWFuZXdzLml0CnxodHRwOi8vamFwYW5maXJzdC5hc2lhbmZyZWVm +b3J1bS5jb20vCnx8YXNpYW5zZXhkaWFyeS5jb20KfHxhc2lhbndvbWVuc2ZpbG0u +ZGUKLmFzaWF0Z3AuY29tCi5hc2lhdG9kYXkudXMKfHxhc2tzdHVkZW50LmNvbQou +YXNreW56Lm5ldAp8fGFza3luei5uZXQKfHxhc3NlbWJsYS5jb20KfHxhc3RyaWxs +LmNvbQp8fGF0Yy5vcmcuYXUKLmF0Y2hpbmVzZS5jb20KfGh0dHA6Ly9hdGNoaW5l +c2UuY29tCmF0Z2Z3Lm9yZwouYXRsYXNwb3N0LmNvbQp8fGF0bGFzcG9zdC5jb20K +fHxhdGRtdC5jb20KLmF0bGFudGExNjguY29tL2ZvcnVtCi5hdG5leHQuY29tCnx8 +YXRuZXh0LmNvbQppY2UuYXVkaW9ub3cuY29tCi5hdi5jb20KfHxhdi5tb3ZpZQph +dmFhei5vcmcKfHxhdmFhei5vcmcKIS0tfHxhdmFzdC5jb20KLmF2Ym9keS50dgou +YXZjaXR5LnR2Ci5hdmNvb2wuY29tCi5hdmRiLmluCnx8YXZkYi5pbgouYXZkYi50 +dgp8fGF2ZGIudHYKLmF2ZmFudGFzeS5jb20KfHxhdmlkZW11eC5vcmcKfHxhdm9p +c2lvbi5jb20KLmF2eWFob28uY29tCnx8YXh1cmVmb3JtYWMuY29tCi5hemVyYmF5 +Y2FuLnR2CmF6ZXJpbWl4LmNvbQohLS1ib3h1bi5henVyZXdlYnNpdGVzLm5ldCBk +b2Vzbid0IGV4aXN0Lgpib3h1biouYXp1cmV3ZWJzaXRlcy5uZXQKfHxib3h1biou +YXp1cmV3ZWJzaXRlcy5uZXQKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLUJCLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLQpmb3J1bS5iYWJ5LWtpbmdkb20uY29tCmJhYnlu +ZXQuY29tLmhrCmJhY2tjaGluYS5jb20KfHxiYWNrY2hpbmEuY29tCi5iYWNrcGFj +a2Vycy5jb20udHcvZm9ydW0KYmFja3RvdGlhbmFubWVuLmNvbQouYmFkam9qby5j +b20KYmFkb28uY29tCnxodHRwOi8vKjIuYmFoYW11dC5jb20udHcKfHxiYWlkdS5q +cAp8fGJhaWxhbmRhaWx5LmNvbQp8fGJhaXhpbmcubWUKfHxiYWtnZWVraG9tZS50 +awouYmFuYW5hLXZwbi5jb20KfHxiYW5hbmEtdnBuLmNvbQouYmFuZHdhZ29uaG9z +dC5jb20KfHxiYW5kd2Fnb25ob3N0LmNvbQouYmFuZ2Jyb3NuZXR3b3JrLmNvbQou +YmFuZ2NoZW4ubmV0CnxodHRwOi8vYmFuZ2NoZW4ubmV0Cnx8YmFuZ3lvdWxhdGVy +LmNvbQpiYW5uZWRib29rLm9yZwp8fGJhbm5lZGJvb2sub3JnCi5iYW5uZWRuZXdz +Lm9yZwouYmFyYW1hbmdhb25saW5lLmNvbQp8aHR0cDovL2JhcmFtYW5nYW9ubGlu +ZS5jb20KLmJhcmVuYWtlZGlzbGFtLmNvbQp8fGJhcm5hYnUuY28udWsKYmFydHZw +bi5jb20KLmJhc3RpbGxlcG9zdC5jb20KYmF5dm9pY2UubmV0Cnx8YmF5dm9pY2Uu +bmV0CmRhanVzaGEuYmF5d29yZHMuY29tCnx8YmJjaGF0LnR2Cnx8YmItY2hhdC50 +dgouYmJnLmdvdgouYmJrei5jb20vZm9ydW0KLmJibnJhZGlvLm9yZwpiYnMtdHcu +Y29tCi5iYnNkaWdlc3QuY29tL3RocmVhZAp8fGJic2ZlZWQuY29tCmJic2xhbmQu +Y29tCi5iYnNtby5jb20KLmJic29uZS5jb20KYmJ0b3lzdG9yZS5jb20KLmJjYXN0 +LmNvLm56Ci5iY2MuY29tLnR3L2JvYXJkCi5iY2NoaW5lc2UubmV0Ci5iY21vcm5p +bmcuY29tCmJkc212aWRlb3MubmV0Ci5iZWFjb25ldmVudHMuY29tCi5iZWJvLmNv +bQp8fGJlYm8uY29tCi5iZWV2cG4uY29tCnx8YmVldnBuLmNvbQouYmVoaW5ka2lu +ay5jb20KfHxiZWlqaW5nMTk4OS5jb20KYmVpamluZ3NwcmluZy5jb20KfHxiZWlq +aW5nc3ByaW5nLmNvbQouYmVpamluZ3p4Lm9yZwp8aHR0cDovL2JlaWppbmd6eC5v +cmcKLmJlbGFtaW9ubGluZS5jb20KLmJlbGwud2lraQp8aHR0cDovL2JlbGwud2lr +aQpiZW15d2lmZS5jYwpiZXJpYy5tZQouYmVybGludHdpdHRlcndhbGwuY29tCnx8 +YmVybGludHdpdHRlcndhbGwuY29tCi5iZXJtLmNvLm56Ci5iZXN0Zm9yY2hpbmEu +b3JnCnx8YmVzdGZvcmNoaW5hLm9yZwouYmVzdGdvcmUuY29tCi5iZXN0cG9ybnN0 +YXJkYi5jb20KfHxiZXN0dnBuLmNvbQouYmVzdHZwbmFuYWx5c2lzLmNvbQouYmVz +dHZwbnNlcnZlci5jb20KLmJlc3R2cG5zZXJ2aWNlLmNvbQouYmVzdHZwbnVzYS5j +b20KfHxiZXQzNjUuY29tCi5iZXRmYWlyLmNvbQp8fGJldHRlcm5ldC5jbwouYmV0 +dGVydnBuLmNvbQp8fGJldHRlcnZwbi5jb20KLmJldHR3ZWVuLmNvbQp8fGJldHR3 +ZWVuLmNvbQp8fGJldHZpY3Rvci5jb20KLmJld3d3Lm5ldAouYmV5b25kZmlyZXdh +bGwuY29tCnx8YmZubi5vcmcKfHxiZnNoLmhrCi5iZ3Zwbi5jb20KfHxiZ3Zwbi5j +b20KLmJpYW5sZWkuY29tCkBAfHxiaWFubGVpLmNvbQpiaWFudGFpbGFqaWFvLmNv +bQpiaWFudGFpbGFqaWFvLmluCi5iaWJsZXNmb3JhbWVyaWNhLm9yZwp8aHR0cDov +L2JpYmxlc2ZvcmFtZXJpY2Eub3JnCi5iaWMyMDExLm9yZwpiaWdmb29scy5jb20K +fHxiaWdqYXBhbmVzZXNleC5jb20KLmJpZ25ld3Mub3JnCnx8YmlnbmV3cy5vcmcK +LmJpZ3NvdW5kLm9yZwouYmlsaXdvcmxkLmNvbQp8aHR0cDovL2JpbGl3b3JsZC5j +b20KfGh0dHA6Ly9iaWxseXBhbi5jb20vd2lraQouYmludXgubWUKYWkuYmlud2Fu +Zy5tZS9jb3VwbGV0CmJpcGljLm5ldAouYml0LmRvCnxodHRwOi8vYml0LmRvCi5i +aXQubHkKfGh0dHA6Ly9iaXQubHkKIS0tfHxiaXRidWNrZXQub3JnCnx8Yml0Y29p +bnRhbGsub3JnCi5iaXRzaGFyZS5jb20KfHxiaXRzaGFyZS5jb20KYml0c25vb3Au +Y29tCi5iaXR2aXNlLmNvbQp8fGJpdHZpc2UuY29tCmJpemhhdC5jb20KfHxibC1k +b3VqaW5zb3Vrby5jb20KLmJqbmV3bGlmZS5vcmcKLmJqcy5vcmcKYmp6Yy5vcmcK +fHxianpjLm9yZwouYmxhY2tsb2dpYy5jb20KLmJsYWNrdnBuLmNvbQp8fGJsYWNr +dnBuLmNvbQpibGV3cGFzcy5jb20KdG9yLmJsaW5nYmxpbmdzcXVhZC5uZXQKLmJs +aW5reC5jb20KfHxibGlua3guY29tCmJsaW53LmNvbQouYmxpcC50dgp8fGJsaXAu +dHYvCi5ibG9ja2NuLmNvbQp8fGJsb2NrY24uY29tCnx8YmxvY2tsZXNzLmNvbQp8 +fGJsb2cuZGUKLmJsb2cuanAKfGh0dHA6Ly9ibG9nLmpwCkBAfHxqcHVzaC5jbgou +YmxvZ2NhdGFsb2cuY29tCnx8YmxvZ2NhdGFsb2cuY29tCnx8YmxvZ2NpdHkubWUK +LmJsb2dnZXIuY29tCnx8YmxvZ2dlci5jb20KYmxvZ2ltZy5qcAp8fGJsb2cua2Fu +Z3llLm9yZwouYmxvZ2xpbmVzLmNvbQp8fGJsb2dsaW5lcy5jb20KfHxibG9nbG92 +aW4uY29tCnJjb252ZXJzYXRpb24uYmxvZ3MuY29tCmJsb2d0ZC5uZXQKLmJsb2d0 +ZC5vcmcKfGh0dHA6Ly9ibG9ndGQub3JnCnx8Ymxvb2RzaGVkLm5ldAouYmxvb21i +ZXJnLmNuCnx8Ymxvb21iZXJnLmNuCi5ibG9vbWJlcmcuY29tCnx8Ymxvb21iZXJn +LmNvbQpibG9vbWJlcmcuZGUKfHxibG9vbWJlcmcuZGUKfHxibG9vbWZvcnR1bmUu +Y29tCmJsdWVhbmdlbGxpdmUuY29tCi5ibWZpbm4uY29tCi5ibmV3cy5jbwp8fGJu +ZXdzLmNvCnx8Ym5ybWV0YWwuY29tCmJvYXJkcmVhZGVyLmNvbS90aHJlYWQKfHxi +b2FyZHJlYWRlci5jb20KLmJvZC5hc2lhCnxodHRwOi8vYm9kLmFzaWEKLmJvZG9n +ODguY29tCi5ib2xlaHZwbi5uZXQKfHxib2xlaHZwbi5uZXQKYm9uYm9ubWUuY29t +Ci5ib25ib25zZXguY29tCi5ib25mb3VuZGF0aW9uLm9yZwouYm9uZ2FjYW1zLmNv +bQp8fGJvb2JzdGFncmFtLmNvbQp8fGJvb2suY29tLnR3CmJvb2tlcHViLmNvbQp8 +fGJvb2tzLmNvbS50dwp8fGJvdGFud2FuZy5jb20KLmJvdC5udQouYm93ZW5wcmVz +cy5jb20KfHxib3dlbnByZXNzLmNvbQp8fGFwcC5ib3guY29tCmRsLmJveC5uZXQK +fHxkbC5ib3gubmV0Ci5ib3hwbi5jb20KfHxib3hwbi5jb20KYm94dW4uY29tCnx8 +Ym94dW4uY29tCi5ib3h1bi50dgp8fGJveHVuLnR2CmJveHVuYmxvZy5jb20KfHxi +b3h1bmJsb2cuY29tCi5ib3h1bmNsdWIuY29tCmJveWFuZ3UuY29tCi5ib3lmcmll +bmR0di5jb20KLmJveXNmb29kLmNvbQp8fGJyLnN0Ci5icmFpbnlxdW90ZS5jb20v +cXVvdGVzL2F1dGhvcnMvZC9kYWxhaV9sYW1hCnx8YnJhbmRvbmh1dGNoaW5zb24u +Y29tCnx8YnJhdW1laXN0ZXIub3JnCi5icmF2b3R1YmUubmV0Cnx8YnJhdm90dWJl +Lm5ldAouYnJhenplcnMuY29tCnx8YnJhenplcnMuY29tCi5icmVhay5jb20KfHxi +cmVhay5jb20KYnJlYWtnZncuY29tCnx8YnJlYWtnZncuY29tCmJyZWFraW5nOTEx +LmNvbQouYnJlYWtpbmd0d2VldHMuY29tCnx8YnJlYWtpbmd0d2VldHMuY29tCnx8 +YnJlYWt3YWxsLm5ldApicmlpYW4uY29tLzY1MTEvZnJlZWdhdGUKLmJyaWVmZHJl +YW0uY29tLyVFNyVCNCVBMCVFNiVBMyVCQQpicml6emx5LmNvbQp8fGJyaXp6bHku +Y29tCnx8YnJrbWQuY29tCmJyb2FkYm9vay5jb20KLmJyb2FkcHJlc3NpbmMuY29t +Cnx8YnJvYWRwcmVzc2luYy5jb20KYmJzLmJyb2NrYmJzLmNvbQpicnVjZXdhbmcu +bmV0Ci5icnV0YWx0Z3AuY29tCnx8YnJ1dGFsdGdwLmNvbQouYnQybWFnLmNvbQp8 +fGJ0OTUuY29tCi5idGFpYS5jb20KLmJ0YnRhdi5jb20KfGh0dHA6Ly9idGRpZ2cu +b3JnCi5idGt1Lm1lCnx8YnRrdS5tZQp8fGJ0a3Uub3JnCi5idHNwcmVhZC5jb20K +LmJ0c3luY2tleXMuY29tCi5idWRhZWR1Lm9yZwp8fGJ1ZGFlZHUub3JnCi5idWRk +aGFuZXQuY29tLnR3L3pmcm9wL3RpYmV0Ci5idWRkaGlzdGNoYW5uZWwudHYKLmJ1 +ZmZlcmVkLmNvbQp8aHR0cDovL2J1ZmZlcmVkLmNvbQouYnVsbG9nLm9yZwp8fGJ1 +bGxvZy5vcmcKLmJ1bGxvZ2dlci5jb20KfHxidWxsb2dnZXIuY29tCmJ1bmJ1bmhr +LmNvbQouYnVzYXlhcmkuY29tCnxodHRwOi8vYnVzYXlhcmkuY29tCi5idXNpbmVz +c2luc2lkZXIuY29tL2JpbmctY291bGQtYmUtY2Vuc29yaW5nLXNlYXJjaC1yZXN1 +bHRzLTIwMTQKLmJ1c2luZXNzaW5zaWRlci5jb20vY2hpbmEtYmFua3MtcHJlcGFy +aW5nLWZvci1kZWJ0LWltcGxvc2lvbi0yMDE0Ci5idXNpbmVzc2luc2lkZXIuY29t +L2hvbmcta29uZy1hY3RpdmlzdHMtZGVmeS1wb2xpY2UtdGVhci1nYXMtYXMtcHJv +dGVzdHMtY29udGludWUtb3Zlcm5pZ2h0LTIwMTQKLmJ1c2luZXNzaW5zaWRlci5j +b20vaW50ZXJuZXQtb3V0YWdlcy1yZXBvcnRlZC1pbi1ub3J0aC1rb3JlYS0yMDE0 +Ci5idXNpbmVzc2luc2lkZXIuY29tL2lwaG9uZS02LWlzLWFwcHJvdmVkLWZvci1z +YWxlLWluLWNoaW5hLTIwMTQKLmJ1c2luZXNzaW5zaWRlci5jb20vbmZsLWFubm91 +bmNlcnMtc3VyZmFjZS10YWJsZXRzLTIwMTQKLmJ1c2luZXNzaW5zaWRlci5jb20v +cGFuYW1hLXBhcGVycwouYnVzaW5lc3NpbnNpZGVyLmNvbS91bWJyZWxsYS1tYW4t +aG9uZy1rb25nLTIwMTQKfGh0dHA6Ly93d3cuYnVzaW5lc3NpbnNpZGVyLmNvbS5h +dS8qCi5idXNpbmVzc3dlZWsuY29tCi5idXN1Lm9yZy9uZXdzCnxodHRwOi8vYnVz +dS5vcmcvbmV3cwpidXN5dHJhZGUuY29tCi5idXVnYWEuY29tCi5idXp6aGFuZC5j +b20KLmJ1enpoYW5kLm5ldAouYnV6em9yYW5nZS5jb20KfHxidXp6b3JhbmdlLmNv +bQp8fGJ2cG4uY29tCmJ3c2ouaGsKfHxieC50bAoKIS0tLS0tLS0tLS0tLS0tLS0t +LS0tQ0MtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi5jLXNwYW52aWRlby5vcmcK +fHxjLXNwYW52aWRlby5vcmcKfHxjLWVzdC1zaW1wbGUuY29tCi5jMTAwdGliZXQu +b3JnCnx8Y2FibGVnYXRlc2VhcmNoLm5ldAouY2FjaGluZXNlLmNvbQouY2Fjbncu +Y29tCnxodHRwOi8vY2FjbncuY29tCi5jYWN0dXN2cG4uY29tCnx8Y2FjdHVzdnBu +LmNvbQouY2FmZXByZXNzLmNvbQouY2Foci5vcmcudHcKLmNhbGFtZW8uY29tL2Jv +b2tzCmNuLmNhbGFtZW8uY29tCnxodHRwOi8vY24uY2FsYW1lby5jb20KLmNhbGdh +cnljaGluZXNlLmNhCi5jYWxnYXJ5Y2hpbmVzZS5jb20KLmNhbGdhcnljaGluZXNl +Lm5ldAp8aHR0cDovL2Jsb2cuY2FsaWJyZS1lYm9vay5jb20KfGh0dHA6Ly9nb29n +bGUuY2Fsc3RhdGUuZWR1CmZhbHVuLmNhbHRlY2guZWR1Ci5pdHMuY2FsdGVjaC5l +ZHUvfmZhbHVuLwouY2FtNC5jb20KLmNhbTQuanAKLmNhbTQuc2cKLmNhbWZyb2cu +Y29tCnx8Y2FtZnJvZy5jb20KfHxjYW1zLmNvbQouY2Ftcy5vcmcuc2cKY2FuYWRh +bWVldC5jb20KLmNhbmFscG9ybm8uY29tCnxodHRwOi8vYmJzLmNhbnRvbmVzZS5h +c2lhLwohLS1odHRwOi8vd3d3LmNhbnRvbmVzZS5hc2lhL2FjdGlvbi1iYnMuaHRt +bAouY2FueXUub3JnCnx8Y2FueXUub3JnCi5jYW8uaW0KLmNhb2JpYW4uaW5mbwp8 +fGNhb2JpYW4uaW5mbwpjYW9jaGFuZ3FpbmcuY29tCnx8Y2FvY2hhbmdxaW5nLmNv +bQouY2FwLm9yZy5oawp8fGNhcC5vcmcuaGsKLmNhcmFiaW5hc3lwaXN0b2xhcy5j +b20KY2FyZGluYWxrdW5nZm91bmRhdGlvbi5vcmcKY2FybW90b3JzaG93LmNvbQpz +cy5jYXJyeXpob3UuY29tCi5jYXJ0b29ubW92ZW1lbnQuY29tCnx8Y2FydG9vbm1v +dmVtZW50LmNvbQouY2FzYWRlbHRpYmV0YmNuLm9yZwouY2FzYXRpYmV0Lm9yZy5t +eAp8aHR0cDovL2Nhc2F0aWJldC5vcmcubXgKY2FyaS5jb20ubXkKfHxjYXJpYmJl +YW5jb20uY29tCi5jYXNpbm9raW5nLmNvbQouY2FzaW5vcml2YS5jb20KfHxjYXRj +aDIyLm5ldAouY2F0Y2hnb2QuY29tCnxodHRwOi8vY2F0Y2hnb2QuY29tCnx8Y2F0 +ZmlnaHRwYXlwZXJ2aWV3Lnh4eAouY2F0aG9saWMub3JnLmhrCnx8Y2F0aG9saWMu +b3JnLmhrCmNhdGhvbGljLm9yZy50dwp8fGNhdGhvbGljLm9yZy50dwouY2F0aHZv +aWNlLm9yZy50dwp8fGNhdHR0LmNvbQouY2JjLmNhCnx8Y2JjLmNhCi5jYnNuZXdz +LmNvbS92aWRlbwouY2J0Yy5vcmcuaGsKIS0uY2NjLmRlCiEtfHxjY2MuZGUKfHxj +Y2NhdC5jYwp8fGNjY2F0LmNvCi5jY2R0ci5vcmcKfHxjY2R0ci5vcmcKLmNjaGVy +ZS5jb20KfHxjY2hlcmUuY29tCi5jY2ltLm9yZwouY2NsaWZlLmNhCmNjbGlmZS5v +cmcKY2NsaWZlZmwub3JnCi5jY3RoZXJlLmNvbQp8fGNjdGhlcmUuY29tCi5jY3Rt +d2ViLm5ldAouY2N0b25nYmFvLmNvbS9hcnRpY2xlLzIwNzg3MzIKY2N1ZS5jYQpj +Y3VlLmNvbQouY2N2b2ljZS5jYQouY2N3Lm9yZy50dwouY2dkZXBvdC5vcmcKfGh0 +dHA6Ly9jZ2RlcG90Lm9yZwp8fGNkYm9vay5vcmcKLmNkY3BhcnR5LmNvbQouY2Rl Zi5vcmcKfHxjZGVmLm9yZwp8fGNkaWcuaW5mbwpjZGpwLm9yZwp8fGNkanAub3Jn -CmNkbmluc3RhZ3JhbS5jb20KfHxjZG5pbnN0YWdyYW0uY29tCi5jZG5ld3MuY29t -LnR3CmNkcDE5ODkub3JnCmNkcDE5OTgub3JnCnx8Y2RwMTk5OC5vcmcKY2RwMjAw -Ni5vcmcKfHxjZHAyMDA2Lm9yZwouY2RwYS51cmwudHcKY2RwZXUub3JnCmNkcHVz -YS5vcmcKY2Rwd2ViLm9yZwp8fGNkcHdlYi5vcmcKY2Rwd3Uub3JnCnx8Y2Rwd3Uu -b3JnCnx8Y2R3LmNvbQouY2VjYy5nb3YKfHxjZWNjLmdvdgp8fGNlbGx1bG8uaW5m -bwp8fGNlbmV3cy5ldQp8fGNlbnRlcmZvcmh1bWFucmVwcm9kLmNvbQp8fGNlbnRy -YWxuYXRpb24uY29tCi5jZW50dXJ5cy5uZXQKfGh0dHA6Ly9jZW50dXJ5cy5uZXQK -LmNmaGtzLm9yZy5oawouY2Z0ZmMuY29tCi5jZ3N0LmVkdQouY2hhbmdlLm9yZwp8 -fGNoYW5nZS5vcmcKLmNoYW5ncC5jb20KfHxjaGFuZ3AuY29tCi5jaGFuZ3NhLm5l -dAp8aHR0cDovL2NoYW5nc2EubmV0Ci5jaGFwbTI1LmNvbQouY2hhdHVyYmF0ZS5j -b20KLmNodWFuZy15ZW4ub3JnCmNoZW5nbWluZ21hZy5jb20KLmNoZW5ndWFuZ2No -ZW5nLmNvbQp8fGNoZW5ndWFuZ2NoZW5nLmNvbQouY2hlbnBva29uZy5jb20KLmNo -ZW5wb2tvbmcubmV0CnxodHRwOi8vY2hlbnBva29uZy5uZXQKfHxjaGVycnlzYXZl -LmNvbQouY2hob25nYmkub3JnCmNoaWNhZ29uY210di5jb20KfGh0dHA6Ly9jaGlj -YWdvbmNtdHYuY29tCi5jaGluYS13ZWVrLmNvbQpjaGluYTEwMS5jb20KfHxjaGlu -YTEwMS5jb20KfHxjaGluYTE4Lm9yZwp8fGNoaW5hMjEuY29tCmNoaW5hMjEub3Jn -Cnx8Y2hpbmEyMS5vcmcKLmNoaW5hNTAwMC51cwpjaGluYWFmZmFpcnMub3JnCnx8 -Y2hpbmFhZmZhaXJzLm9yZwp8fGNoaW5hYWlkLm1lCmNoaW5hYWlkLnVzCmNoaW5h -YWlkLm9yZwpjaGluYWFpZC5uZXQKY2hpbmFjb21tZW50cy5vcmcKfHxjaGluYWNv -bW1lbnRzLm9yZwpjaGluYWNoYW5nZS5vcmcKY2hpbmFjaGFubmVsLmhrCnx8Y2hp -bmFjaGFubmVsLmhrCi5jaGluYWNpdHluZXdzLmJlCi5jaGluYWRpYWxvZ3VlLm5l -dAouY2hpbmFkaWdpdGFsdGltZXMubmV0Cnx8Y2hpbmFkaWdpdGFsdGltZXMubmV0 -Ci5jaGluYWVsZWN0aW9ucy5vcmcKfHxjaGluYWVsZWN0aW9ucy5vcmcKLmNoaW5h -ZXdlZWtseS5jb20KfHxjaGluYWV3ZWVrbHkuY29tCnx8Y2hpbmFmcmVlcHJlc3Mu -b3JnCi5jaGluYWdhdGUuY29tCmNoaW5hZ2Vla3Mub3JnCmNoaW5hZ2Z3Lm9yZwp8 -fGNoaW5hZ2Z3Lm9yZwouY2hpbmFnb25ldC5jb20KLmNoaW5hZ3JlZW5wYXJ0eS5v -cmcKfHxjaGluYWdyZWVucGFydHkub3JnCi5jaGluYWhvcml6b24ub3JnCnx8Y2hp -bmFob3Jpem9uLm9yZwouY2hpbmFodXNoLmNvbQouY2hpbmFpbnBlcnNwZWN0aXZl -LmNvbQp8fGNoaW5haW50ZXJpbWdvdi5vcmcKY2hpbmFsYWJvcndhdGNoLm9yZwpj -aGluYWxhd3RyYW5zbGF0ZS5jb20KLmNoaW5hcG9zdC5jb20udHcvdGFpd2FuL25h -dGlvbmFsL25hdGlvbmFsLW5ld3MKY2hpbmF4Y2hpbmEuY29tL2hvd3RvCmNoaW5h -bGF3YW5kcG9saWN5LmNvbQouY2hpbmFtdWxlLmNvbQp8fGNoaW5hbXVsZS5jb20K -Y2hpbmFtei5vcmcKLmNoaW5hcHJlc3MuY29tLm15Cnx8Y2hpbmFwcmVzcy5jb20u -bXkKLmNoaW5hcmlnaHRzaWEub3JnCmNoaW5hc21pbGUubmV0L2ZvcnVtcwpjaGlu -YXNvY2lhbGRlbW9jcmF0aWNwYXJ0eS5jb20KfHxjaGluYXNvY2lhbGRlbW9jcmF0 -aWNwYXJ0eS5jb20KY2hpbmFzb3VsLm9yZwp8fGNoaW5hc291bC5vcmcKLmNoaW5h -c3Vja3MubmV0Ci5jaGluYXRpbWVzLmNvbS9yZWFsdGltZW5ld3MvMjYwNDA5Lwp8 -fGNoaW5hdG9wc2V4LmNvbQouY2hpbmF0b3duLmNvbS5hdQpjaGluYXR3ZWVwcy5j -b20KY2hpbmF3YXkub3JnCi5jaGluYXdvcmtlci5pbmZvCnx8Y2hpbmF3b3JrZXIu -aW5mbwpjaGluYXlvdXRoLm9yZy5oawpjaGluYXl1YW5taW4ub3JnCnx8Y2hpbmF5 -dWFubWluLm9yZwouY2hpbmVzZS1oZXJtaXQubmV0CmNoaW5lc2UtbGVhZGVycy5v -cmcKY2hpbmVzZS1tZW1vcmlhbC5vcmcKLmNoaW5lc2VkYWlseS5jb20KfHxjaGlu -ZXNlZGFpbHluZXdzLmNvbQouY2hpbmVzZWRlbW9jcmFjeS5jb20KfHxjaGluZXNl -ZGVtb2NyYWN5LmNvbQp8fGNoaW5lc2VnYXkub3JnCi5jaGluZXNlbi5kZQp8fGNo -aW5lc2VuLmRlCi5jaGluZXNlcGVuLm9yZwouY2hpbmVzZXRhbGtzLm5ldC9jaAou -Y2hpbmdjaGVvbmcuY29tCnx8Y2hpbmdjaGVvbmcuY29tCi5jaGlubWFuLm5ldAp8 -aHR0cDovL2NoaW5tYW4ubmV0CmNoaXRodS5vcmcKY2huLmNob3N1bi5jb20KLmNo -cmRuZXQuY29tCnxodHRwOi8vY2hyZG5ldC5jb20KLmNocmlzdGlhbmZyZWVkb20u -b3JnCnxodHRwOi8vY2hyaXN0aWFuZnJlZWRvbS5vcmcKY2hyaXN0aWFuc3R1ZHku -Y29tCnx8Y2hyaXN0aWFuc3R1ZHkuY29tCmNocmlzdHVzcmV4Lm9yZy93d3cxL3Nk -Ywp8fGNocm9tZWFkYmxvY2suY29tCmNodWJ1bi5jb20KY2h1aXppLm5ldAp8fGNo -cmlzdGlhbnRpbWVzLm9yZy5oawouY2hybGF3eWVycy5oawp8aHR0cDovL2Nocmxh -d3llcnMuaGsKLmNodXJjaGluaG9uZ2tvbmcub3JnL2I1L2luZGV4LnBocAp8aHR0 -cDovL2NodXJjaGluaG9uZ2tvbmcub3JnL2I1L2luZGV4LnBocAouY2luZWFzdGVu -dHJlZmYuZGUKLmNpcGZnLm9yZwp8fGNpcmNsZXRoZWJheWZvcnRpYmV0Lm9yZwp8 -aHR0cDovL2NpdGl6ZW5sYWIub3JnCnxodHRwOi8vd3d3LmNpdGl6ZW5sYWIub3Jn -Cnx8Y2l0aXplbnNjb21taXNzaW9uLmhrCi5jaXRpemVubGFiLm9yZwpjaXRpemVu -c3JhZGlvLm9yZwouY2l0eTM2NS5jYQp8aHR0cDovL2NpdHkzNjUuY2EKY2l0eTl4 -LmNvbQouY2l0eXRhbGsudHcvZXZlbnQKLmNpdmljcGFydHkuaGsKfHxjaXZpY3Bh -cnR5LmhrCmNpdmlsaHJmcm9udC5vcmcKfHxjaXZpbGhyZnJvbnQub3JnCi5jaXZp -bGlhbmd1bm5lci5jb20KLmNpdmlsbWVkaWEudHcKfHxjaXZpbG1lZGlhLnR3CnBz -aXBob24uY2l2aXNlYy5vcmcKfHx2cG4uY2piLm5ldAouY2sxMDEuY29tCnx8Y2sx -MDEuY29tCi5jbGFyaW9ucHJvamVjdC5vcmcvbmV3cy9pc2xhbWljLXN0YXRlLWlz -aXMtaXNpbC1wcm9wYWdhbmRhCnx8Y2xhc3NpY2FsZ3VpdGFyYmxvZy5uZXQKLmNs -Yi5vcmcuaGsKY2xlYXJoYXJtb255Lm5ldApjbGVhcndpc2RvbS5uZXQKY2xpbmlj -YS10aWJldC5ydQouY2xpcGZpc2guZGUKY2xvYWtwb2ludC5jb20KfHxjbHViMTA2 -OS5jb20KY21pLm9yZy50dwp8aHR0cDovL3d3dy5jbW9pbmMub3JnCmNtcC5oa3Uu -aGsKaGt1cG9wLmhrdS5oawp8fGNtdWxlLmNvbQp8fGNtdWxlLm9yZwp8fGNtcy5n -b3YKLmNuNi5ldQouY25hLmNvbS50dwp8fGNuYS5jb20udHcKLmNuYWJjLmNvbQou -Y25kLm9yZwp8fGNuZC5vcmcKZG93bmxvYWQuY25ldC5jb20vRnJlZWdhdGUKLmNu -ZXgub3JnLmNuCi5jbmluZXUuY29tCndpa2kuY25pdHRlci5jb20KLmNubi5jb20v -dmlkZW8KLmNucG9saXRpY3Mub3JnCnx8Y25wb2xpdGljcy5vcmcKLmNuLXByb3h5 -LmNvbQp8aHR0cDovL2NuLXByb3h5LmNvbQouY25wcm94eS5jb20KYmxvZy5jbnll -cy5jb20KbmV3cy5jbnllcy5jb20KfHxjb2F0LmNvLmpwCi5jb2NoaW5hLmNvCnx8 -Y29jaGluYS5jbwp8fGNvY2hpbmEub3JnCi5jb2RlMTk4NC5jb20vNjQKfGh0dHA6 -Ly9nb2FnZW50LmNvZGVwbGV4LmNvbQp8fGNvZGVzaGFyZS5pbwp8fGNvZGVza3Vs -cHRvci5vcmcKfGh0dHA6Ly90b3NoLmNvbWVkeWNlbnRyYWwuY29tCmNvbWVmcm9t -Y2hpbmEuY29tCnx8Y29tZWZyb21jaGluYS5jb20KLmNvbWljLW1lZ2EubWUKY29t -bWFuZGFybXMuY29tCnx8Y29tbWVudHNoay5jb20KLmNvbW11bmlzdGNyaW1lcy5v -cmcKfHxjb21tdW5pc3RjcmltZXMub3JnCnx8Y29tbXVuaXR5Y2hvaWNlY3UuY29t -Cnx8Y29tcGlsZWhlYXJ0LmNvbQouY29udGFjdG1hZ2F6aW5lLm5ldAouY29udmlv +Ci5jZG4tYXBwbGUuY29tCnx8Y2RuLWFwcGxlLmNvbQouY2RuZXdzLmNvbS50dwpj +ZHAxOTg5Lm9yZwpjZHAxOTk4Lm9yZwp8fGNkcDE5OTgub3JnCmNkcDIwMDYub3Jn +Cnx8Y2RwMjAwNi5vcmcKLmNkcGEudXJsLnR3CmNkcGV1Lm9yZwpjZHB1c2Eub3Jn +CmNkcHdlYi5vcmcKfHxjZHB3ZWIub3JnCmNkcHd1Lm9yZwp8fGNkcHd1Lm9yZwp8 +fGNkdy5jb20KLmNlY2MuZ292Cnx8Y2VjYy5nb3YKfHxjZWxsdWxvLmluZm8KfHxj +ZW5ld3MuZXUKfHxjZW50ZXJmb3JodW1hbnJlcHJvZC5jb20KfHxjZW50cmFsbmF0 +aW9uLmNvbQouY2VudHVyeXMubmV0CnxodHRwOi8vY2VudHVyeXMubmV0Ci5jZmhr +cy5vcmcuaGsKLmNmdGZjLmNvbQouY2dzdC5lZHUKLmNoYW5nZS5vcmcKfHxjaGFu +Z2Uub3JnCi5jaGFuZ3AuY29tCnx8Y2hhbmdwLmNvbQouY2hhbmdzYS5uZXQKfGh0 +dHA6Ly9jaGFuZ3NhLm5ldAouY2hhbm5lbDhuZXdzLnNnL25ld3M4Ci5jaGFwbTI1 +LmNvbQouY2hhdHVyYmF0ZS5jb20KLmNodWFuZy15ZW4ub3JnCmNoZW5nbWluZ21h +Zy5jb20KLmNoZW5ndWFuZ2NoZW5nLmNvbQp8fGNoZW5ndWFuZ2NoZW5nLmNvbQou +Y2hlbnBva29uZy5jb20KLmNoZW5wb2tvbmcubmV0CnxodHRwOi8vY2hlbnBva29u +Zy5uZXQKfHxjaGVycnlzYXZlLmNvbQouY2hob25nYmkub3JnCmNoaWNhZ29uY210 +di5jb20KfGh0dHA6Ly9jaGljYWdvbmNtdHYuY29tCi5jaGluYS13ZWVrLmNvbQpj +aGluYTEwMS5jb20KfHxjaGluYTEwMS5jb20KfHxjaGluYTE4Lm9yZwp8fGNoaW5h +MjEuY29tCmNoaW5hMjEub3JnCnx8Y2hpbmEyMS5vcmcKLmNoaW5hNTAwMC51cwpj +aGluYWFmZmFpcnMub3JnCnx8Y2hpbmFhZmZhaXJzLm9yZwp8fGNoaW5hYWlkLm1l +CmNoaW5hYWlkLnVzCmNoaW5hYWlkLm9yZwpjaGluYWFpZC5uZXQKY2hpbmFjb21t +ZW50cy5vcmcKfHxjaGluYWNvbW1lbnRzLm9yZwouY2hpbmFjaGFuZ2Uub3JnCnx8 +Y2hpbmFjaGFuZ2Uub3JnCmNoaW5hY2hhbm5lbC5oawp8fGNoaW5hY2hhbm5lbC5o +awouY2hpbmFjaXR5bmV3cy5iZQouY2hpbmFkaWFsb2d1ZS5uZXQKLmNoaW5hZGln +aXRhbHRpbWVzLm5ldAp8fGNoaW5hZGlnaXRhbHRpbWVzLm5ldAouY2hpbmFlbGVj +dGlvbnMub3JnCnx8Y2hpbmFlbGVjdGlvbnMub3JnCi5jaGluYWV3ZWVrbHkuY29t +Cnx8Y2hpbmFld2Vla2x5LmNvbQp8fGNoaW5hZnJlZXByZXNzLm9yZwouY2hpbmFn +YXRlLmNvbQpjaGluYWdlZWtzLm9yZwpjaGluYWdmdy5vcmcKfHxjaGluYWdmdy5v +cmcKLmNoaW5hZ29uZXQuY29tCi5jaGluYWdyZWVucGFydHkub3JnCnx8Y2hpbmFn +cmVlbnBhcnR5Lm9yZwouY2hpbmFob3Jpem9uLm9yZwp8fGNoaW5haG9yaXpvbi5v +cmcKLmNoaW5haHVzaC5jb20KLmNoaW5haW5wZXJzcGVjdGl2ZS5jb20KfHxjaGlu +YWludGVyaW1nb3Yub3JnCmNoaW5hbGFib3J3YXRjaC5vcmcKY2hpbmFsYXd0cmFu +c2xhdGUuY29tCi5jaGluYXBvc3QuY29tLnR3L3RhaXdhbi9uYXRpb25hbC9uYXRp +b25hbC1uZXdzCmNoaW5heGNoaW5hLmNvbS9ob3d0bwpjaGluYWxhd2FuZHBvbGlj +eS5jb20KLmNoaW5hbXVsZS5jb20KfHxjaGluYW11bGUuY29tCmNoaW5hbXoub3Jn +Ci5jaGluYXByZXNzLmNvbS5teQp8fGNoaW5hcHJlc3MuY29tLm15Ci5jaGluYS1y +ZXZpZXcuY29tLnVhCnxodHRwOi8vY2hpbmEtcmV2aWV3LmNvbS51YQouY2hpbmFy +aWdodHNpYS5vcmcKY2hpbmFzbWlsZS5uZXQvZm9ydW1zCmNoaW5hc29jaWFsZGVt +b2NyYXRpY3BhcnR5LmNvbQp8fGNoaW5hc29jaWFsZGVtb2NyYXRpY3BhcnR5LmNv +bQpjaGluYXNvdWwub3JnCnx8Y2hpbmFzb3VsLm9yZwouY2hpbmFzdWNrcy5uZXQK +LmNoaW5hdGltZXMuY29tL3JlYWx0aW1lbmV3cy8yNjA0MDkvCnx8Y2hpbmF0b3Bz +ZXguY29tCi5jaGluYXRvd24uY29tLmF1CmNoaW5hdHdlZXBzLmNvbQpjaGluYXdh +eS5vcmcKLmNoaW5hd29ya2VyLmluZm8KfHxjaGluYXdvcmtlci5pbmZvCmNoaW5h +eW91dGgub3JnLmhrCmNoaW5heXVhbm1pbi5vcmcKfHxjaGluYXl1YW5taW4ub3Jn +Ci5jaGluZXNlLWhlcm1pdC5uZXQKY2hpbmVzZS1sZWFkZXJzLm9yZwpjaGluZXNl +LW1lbW9yaWFsLm9yZwouY2hpbmVzZWRhaWx5LmNvbQp8fGNoaW5lc2VkYWlseW5l +d3MuY29tCi5jaGluZXNlZGVtb2NyYWN5LmNvbQp8fGNoaW5lc2VkZW1vY3JhY3ku +Y29tCnx8Y2hpbmVzZWdheS5vcmcKLmNoaW5lc2VuLmRlCnx8Y2hpbmVzZW4uZGUK +LmNoaW5lc2VwZW4ub3JnCi5jaGluZXNldGFsa3MubmV0L2NoCnx8Y2hpbmVzZXVw +cmVzcy5jb20KLmNoaW5nY2hlb25nLmNvbQp8fGNoaW5nY2hlb25nLmNvbQouY2hp +bm1hbi5uZXQKfGh0dHA6Ly9jaGlubWFuLm5ldApjaGl0aHUub3JnCnxodHRwOi8v +Y2huLmNob3N1bi5jb20KY25uZXdzLmNob3N1bi5jb20vY2xpZW50L25ld3Mvdml3 +LmFzcD9jYXRlPUMwMSZtY2F0ZQouY2hyZG5ldC5jb20KfGh0dHA6Ly9jaHJkbmV0 +LmNvbQouY2hyaXN0aWFuZnJlZWRvbS5vcmcKfGh0dHA6Ly9jaHJpc3RpYW5mcmVl +ZG9tLm9yZwpjaHJpc3RpYW5zdHVkeS5jb20KfHxjaHJpc3RpYW5zdHVkeS5jb20K +Y2hyaXN0dXNyZXgub3JnL3d3dzEvc2RjCi5jaHVib2xkLmNvbQpjaHVidW4uY29t +CmNodWl6aS5uZXQKY2hyaXN0aWFudGltZXMub3JnLmhrCi5jaHJsYXd5ZXJzLmhr +CnxodHRwOi8vY2hybGF3eWVycy5oawouY2h1cmNoaW5ob25na29uZy5vcmcvYjUv +aW5kZXgucGhwCnxodHRwOi8vY2h1cmNoaW5ob25na29uZy5vcmcvYjUvaW5kZXgu +cGhwCi5jaHVzaGlnYW5nZHJ1Zy5jaAouY2llbmVuLmNvbQouY2luZWFzdGVudHJl +ZmYuZGUKLmNpcGZnLm9yZwp8fGNpcmNsZXRoZWJheWZvcnRpYmV0Lm9yZwp8fGNp +cm9zYW50aWxsaS5jb20KLmNpdGl6ZW5jbi5jb20KfHxjaXRpemVuY24uY29tCnxo +dHRwOi8vY2l0aXplbmxhYi5vcmcKfGh0dHA6Ly93d3cuY2l0aXplbmxhYi5vcmcK +fHxjaXRpemVuc2NvbW1pc3Npb24uaGsKLmNpdGl6ZW5sYWIub3JnCmNpdGl6ZW5z +cmFkaW8ub3JnCi5jaXR5MzY1LmNhCnxodHRwOi8vY2l0eTM2NS5jYQpjaXR5OXgu +Y29tCnx8Y2l0eXBvcHVsYXRpb24uZGUKLmNpdHl0YWxrLnR3L2V2ZW50Ci5jaXZp +Y3BhcnR5LmhrCnx8Y2l2aWNwYXJ0eS5oawouY2l2aWxkaXNvYmVkaWVuY2Vtb3Zl +bWVudC5vcmcKY2l2aWxocmZyb250Lm9yZwp8fGNpdmlsaHJmcm9udC5vcmcKLmNp +dmlsaWFuZ3VubmVyLmNvbQouY2l2aWxtZWRpYS50dwp8fGNpdmlsbWVkaWEudHcK +cHNpcGhvbi5jaXZpc2VjLm9yZwp8fHZwbi5jamIubmV0Ci5jazEwMS5jb20KfHxj +azEwMS5jb20KLmNsYXJpb25wcm9qZWN0Lm9yZy9uZXdzL2lzbGFtaWMtc3RhdGUt +aXNpcy1pc2lsLXByb3BhZ2FuZGEKfHxjbGFzc2ljYWxndWl0YXJibG9nLm5ldAou +Y2xiLm9yZy5oawpjbGVhcmhhcm1vbnkubmV0CmNsZWFyd2lzZG9tLm5ldApjbGlu +aWNhLXRpYmV0LnJ1Ci5jbGlwZmlzaC5kZQpjbG9ha3BvaW50LmNvbQp8fGNsdWIx +MDY5LmNvbQpjbWkub3JnLnR3CnxodHRwOi8vd3d3LmNtb2luYy5vcmcKY21wLmhr +dS5oawpoa3Vwb3AuaGt1LmhrCnx8Y211bGUuY29tCnx8Y211bGUub3JnCnx8Y21z +Lmdvdgp8aHR0cDovL3Zwbi5jbXUuZWR1CnxodHRwOi8vdnBuLnN2LmNtdS5lZHUK +LmNuNi5ldQouY25hLmNvbS50dwp8fGNuYS5jb20udHcKLmNuYWJjLmNvbQouY25k +Lm9yZwp8fGNuZC5vcmcKZG93bmxvYWQuY25ldC5jb20KLmNuZXgub3JnLmNuCi5j +bmluZXUuY29tCndpa2kuY25pdHRlci5jb20KLmNubi5jb20vdmlkZW8KLmNucG9s +aXRpY3Mub3JnCnx8Y25wb2xpdGljcy5vcmcKLmNuLXByb3h5LmNvbQp8aHR0cDov +L2NuLXByb3h5LmNvbQouY25wcm94eS5jb20KYmxvZy5jbnllcy5jb20KbmV3cy5j +bnllcy5jb20KfHxjb2F0LmNvLmpwCi5jb2NoaW5hLmNvCnx8Y29jaGluYS5jbwp8 +fGNvY2hpbmEub3JnCi5jb2RlMTk4NC5jb20vNjQKfGh0dHA6Ly9nb2FnZW50LmNv +ZGVwbGV4LmNvbQp8fGNvZGVzaGFyZS5pbwp8fGNvZGVza3VscHRvci5vcmcKfGh0 +dHA6Ly90b3NoLmNvbWVkeWNlbnRyYWwuY29tCmNvbWVmcm9tY2hpbmEuY29tCnx8 +Y29tZWZyb21jaGluYS5jb20KLmNvbWljLW1lZ2EubWUKY29tbWFuZGFybXMuY29t +Cnx8Y29tbWVudHNoay5jb20KLmNvbW11bmlzdGNyaW1lcy5vcmcKfHxjb21tdW5p +c3RjcmltZXMub3JnCnx8Y29tbXVuaXR5Y2hvaWNlY3UuY29tCnx8Y29tcGlsZWhl +YXJ0LmNvbQp8fGNvbm9oYS5qcAouY29udGFjdG1hZ2F6aW5lLm5ldAouY29udmlv Lm5ldAouY29vYmF5LmNvbQp8aHR0cDovL3d3dy5jb29sMTguY29tL2JicyovCi5j b29sYWxlci5jb20KfHxjb29sYWxlci5jb20KY29vbGRlci5jb20KfHxjb29sZGVy LmNvbQp8fGNvb2xsb3VkLm9yZy50dwouY29vbG5jdXRlLmNvbQpjb3J1bWNvbGxl -Z2UuY29tCi5jb3MtbW9lLmNvbQp8aHR0cDovL2Nvcy1tb2UuY29tCnx8Y291Y2hk -Yndpa2kuY29tCnx8Y290d2VldC5jb20KY3BqLm9yZwp8fGNwai5vcmcvCmNyYWNr -bGUuY29tCnx8Y3JhY2tsZS5jb20KfHxjcmNoaW5hLm9yZwpjcmQtbmV0Lm9yZwpj -cmVhZGVycy5uZXQKfHxjcmVhZGVycy5uZXQKLmNyZWFkZXJzbmV0LmNvbQp8fGNy -aXN0eWxpLmNvbQouY3JvY290dWJlLmNvbQp8aHR0cDovL2Nyb2NvdHViZS5jb20K -LmNyb3NzdGhld2FsbC5uZXQKfHxjcm9zc3RoZXdhbGwubmV0CmNzZHBhcnR5LmNv -bQp8fGNzZHBhcnR5LmNvbQp8fGNzdWNoZW4uZGUKLmN0YW8ub3JnCi5jdGZyaWVu -ZC5uZXQKLmN0aXR2LmNvbS50dwpjdHMuY29tLnR3CnxodHRwOi8vbGlicmFyeS51 -c2MuY3Voay5lZHUuaGsvCnxodHRwOi8vbWpsc2gudXNjLmN1aGsuZWR1LmhrLwou -Y3Voa2Fjcy5vcmcvfmJlbm5nCi5jdWlodWEub3JnCnx8Y3VpaHVhLm9yZwouY3Vp -d2VpcGluZy5uZXQKfHxjdWl3ZWlwaW5nLm5ldAp8fGN1bHR1cmUudHcKLmN1bWxv -dWRlci5jb20KfHxjdW1sb3VkZXIuY29tCnx8Y3VydmVmaXNoLmNvbQouY3VzdS5o -awp8fGN1c3UuaGsKLmN3LmNvbS50dwp8aHR0cDovL2ZvcnVtLmN5YmVyY3RtLmNv -bQpjeWJlcmdob3N0dnBuLmNvbQp8fGN5YmVyZ2hvc3R2cG4uY29tCnx8Y3luc2Ny -aWJlLmNvbQpjeXRvZGUudXMKfHxpZmFuLmN6LmNjCnx8bWlrZS5jei5jYwp8fG5p -Yy5jei5jYwoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tREQtLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tCmNsLmQwei5uZXQKLmQxMDAubmV0Ci5kMmJheS5jb20KfGh0dHA6 -Ly9kMmJheS5jb20KLmRhYnIuY28udWsKfHxkYWJyLmNvLnVrCmRhYnIuZXUKZGFi -ci5tb2JpCnx8ZGFici5tb2JpCnx8ZGFici5tZQpkYWRhemltLmNvbQp8fGRhZGF6 -aW0uY29tCi5kYWRpMzYwLmNvbQpkYWZhZ29vZC5jb20KZGFmYWhhby5jb20KLmRh -aWRvc3R1cC5ydQp8aHR0cDovL2RhaWRvc3R1cC5ydQouZGFpbGlkYWlsaS5jb20K -fHxkYWlsaWRhaWxpLmNvbQouZGFpbHltb3Rpb24uY29tCnx8ZGFpbHltb3Rpb24u -Y29tCmRhaXBoYXBpbmZvLm5ldAouZGFqaXl1YW4uY29tCnx8ZGFqaXl1YW4uZGUK -ZGFqaXl1YW4uZXUKZGFsYWlsYW1hLmNvbQouZGFsYWlsYW1hLm1uCnxodHRwOi8v -ZGFsYWlsYW1hLm1uCi5kYWxhaWxhbWEucnUKfHxkYWxhaWxhbWEucnUKZGFsYWls -YW1hODAub3JnCi5kYWxhaWxhbWEtYXJjaGl2ZXMub3JnCi5kYWxhaWxhbWFjZW50 -ZXIub3JnCnxodHRwOi8vZGFsYWlsYW1hY2VudGVyLm9yZwpkYWxhaWxhbWFmZWxs -b3dzLm9yZwouZGFsYWlsYW1hZmlsbS5jb20KLmRhbGFpbGFtYWZvdW5kYXRpb24u -b3JnCi5kYWxhaWxhbWFoaW5kaS5jb20KLmRhbGFpbGFtYWluYXVzdHJhbGlhLm9y -ZwouZGFsYWlsYW1hamFwYW5lc2UuY29tCi5kYWxhaWxhbWFwcm90ZXN0ZXJzLmlu -Zm8KLmRhbGFpbGFtYXF1b3Rlcy5vcmcKLmRhbGFpbGFtYXRydXN0Lm9yZwouZGFs -YWlsYW1hdmlzaXQub3JnLm56Ci5kYWxhaWxhbWF3b3JsZC5jb20KfHxkYWxhaWxh -bWF3b3JsZC5jb20KZGFsaWFubWVuZy5vcmcKfHxkYWxpYW5tZW5nLm9yZwouZGFs -aXVsaWFuLm9yZwp8fGRhbGl1bGlhbi5vcmcKLmRhbmtlNGNoaW5hLm5ldAp8fGRh -bmtlNGNoaW5hLm5ldAouZGFud2VpLm9yZwpkYW9sYW4ubmV0CmRhcmt0b3kubmV0 -Cnx8ZGFzdHJhc3NpLm9yZwpibG9nLmRhdW0ubmV0L19ibG9nCi5kYXZpZC1raWxn -b3VyLmNvbQp8aHR0cDovL2RhdmlkLWtpbGdvdXIuY29tCmRheGEuY24KfHxkYXhh -LmNuCmNuLmRheWFib29rLmNvbQouZGF5bGlmZS5jb20vdG9waWMvZGFsYWlfbGFt -YQp8fGRiLnR0Ci5kYmMuaGsvbWFpbgp8fGRjYXJkLnR3CmRjbWlsaXRhcnkuY29t -Ci5kZGMuY29tLnR3Ci5kZGh3LmluZm8KIS0tQ2hhbmdlSVAKLmRkbnMubXMKZGRu -cy5uZXQKfHxkZS1zY2kub3JnCi5kZS1zY2kub3JnCnBhY2thZ2VzLmRlYmlhbi5v -cmcvemgtY24vbGVubnkvZ3Bhc3MKfHxkZWNvZGV0LmNvCgohLS1PcmlnaW46Y2Ru -LWkzMCRfCiEtLUV4Y2VwdGlvbjogSG9tZXBhZ2UgYWNjZXNzIHdpdGhvdXQgcnN0 -CiEtLUtleXdvcmQgaXMgJF8KLmRlZmluZWJhYmUuY29tCgp8fGRlbGNhbXAubmV0 -CmRlbGljaW91cy5jb20vR0ZXYm9va21hcmsKLmRlbW9jcmF0cy5vcmcKfHxkZW1v -Y3JhdHMub3JnCnx8ZGVzYy5zZQp8fGRlc3NjaS5jb20KLmRlc3Ryb3ktY2hpbmEu -anAKfHxkZXV0c2NoZS13ZWxsZS5kZQohLS18fGRldmlhbnRhcnQuY29tCiEtLXx8 -ZGV2aWFudGFydC5uZXQKfHxkZXZpby51cwp8fGRldnBuLmNvbQp8fGRmYXMubWls -CmRmbi5vcmcKZGhhcm1ha2FyYS5uZXQKLmRoYXJhbXNhbGFuZXQuY29tCi5kaWFv -eXVpc2xhbmRzLm9yZwp8fGRpYW95dWlzbGFuZHMub3JnCnxodHRwOi8vZGlnaWxh -bmQudHcvCnx8ZGlnaXRhbG5vbWFkc3Byb2plY3Qub3JnCi5kaWlnby5jb20KfHxk -aWlnby5jb20KfHxkaWxiZXIuc2UKfHxmdXJsLm5ldAouZGlwaXR5LmNvbQp8fGRp -cmVjdGNyZWF0aXZlLmNvbQohLS18fGRpc2NvZ3MuY29tCiEtLUBAfHxjZG4uZGlz -Y29ncy5jb20KfGh0dHBzOi8vc2VhcmNoLmRpc2Nvbm5lY3QubWUKLmRpc2N1c3Mu -Y29tLmhrCnx8ZGlzY3Vzcy5jb20uaGsKLmRpc2N1c3M0dS5jb20KZGlzcC5jYwou -ZGlzcXVzLmNvbQp8fGRpc3F1cy5jb20KLmRpdC1pbmMudXMKfHxkaXQtaW5jLnVz -Ci5kaXpoaWRpemhpLmNvbQp8fGRpemh1emhpc2hhbmcuY29tCmRqYW5nb3NuaXBw -ZXRzLm9yZwouZGpvcnouY29tCnx8ZGpvcnouY29tCnx8ZGwtbGFieS5qcAp8fGRs -c2l0ZS5jb20KfHxkbWNkbi5uZXQKLmRuc2NyeXB0Lm9yZwp8fGRuc2NyeXB0Lm9y -Zwp8fGRuczJnby5jb20KfHxkbnNzZWMubmV0CmRvY3RvcnZvaWNlLm9yZwoKIS0t -RG9nRmFydE5ldHdvcmsKLmRvZ2ZhcnRuZXR3b3JrLmNvbS90b3VyCmdsb3J5aG9s -ZS5jb20KCi5kb2ppbi5jb20KLmRvay1mb3J1bS5uZXQKfHxkb2xjLmRlCnx8ZG9s -Zi5vcmcuaGsKfHxkb2xsZi5jb20KLmRvbWFpbi5jbHViLnR3Ci5kb21haW50b2Rh -eS5jb20uYXUKZG9uZ3RhaXdhbmcuY29tCnx8ZG9uZ3RhaXdhbmcuY29tCi5kb25n -dGFpd2FuZy5uZXQKfHxkb25ndGFpd2FuZy5uZXQKLmRvbmd5YW5namluZy5jb20K -LmRvbnRmaWx0ZXIudXMKfHxkb250bW92ZXRvY2hpbmEuY29tCi5kb3JqZXNodWdk -ZW4uY29tCi5kb3RwbGFuZS5jb20KfHxkb3RwbGFuZS5jb20KfHxkb3RzdWIuY29t -Cnx8ZG91Z3NjcmlwdHMuY29tCnx8ZG91amluY2FmZS5jb20KZG93ZWkub3JnCiEt -LXx8ZG94eWdlbi5vcmcKZHBoay5vcmcKZHBwLm9yZy50dwp8fGRwcC5vcmcudHcK -fHxkcHIuaW5mbwp8fGRyYWdvbnNwcmluZ3Mub3JnCnx8ZHJhdy5pbwp8fGRyZWFt -bWFzay5vcmcKLmRyZXB1bmcub3JnCnx8ZHJnYW4ubmV0Ci5kcm1pbmd4aWEub3Jn -CnxodHRwOi8vZHJtaW5neGlhLm9yZwp8fGRyb3Bib3guY29tCnx8YXBpLmRyb3Bi -b3hhcGkuY29tCnx8ZHJvcGJveHVzZXJjb250ZW50LmNvbQpkcnN1bmFjYWRlbXku -Y29tCi5kcnR1YmVyLmNvbQouZHNjbi5pbmZvCnxodHRwOi8vZHNjbi5pbmZvCi5k -c3RrLmRrCnxodHRwOi8vZHN0ay5kawp8fGR0aWJsb2cuY29tCnx8ZHRpYy5taWwK -ZHRpc2VydjIuY29tCi5kdHdhbmcub3JnCi5kdWFuemhpaHUuY29tCi5kdWNrZG5z -Lm9yZwp8aHR0cDovL2R1Y2tkbnMub3JnCi5kdWNrZHVja2dvLmNvbQp8fGR1Y2tk -dWNrZ28uY29tCi5kdWNrbG9hZC5jb20vZG93bmxvYWQKfHxkdWNrbXlsaWZlLmNv -bQouZHVnYS5qcAp8aHR0cDovL2R1Z2EuanAKLmR1aWh1YS5vcmcKfHxkdWlodWEu -b3JnCnx8ZHVpaHVhaHJqb3VybmFsLm9yZwouZHVvd2VpdGltZXMuY29tCnx8ZHVv -d2VpdGltZXMuY29tCmR1cGluZy5uZXQKfHxkdXBsaWNhdGkuY29tCmR1cG9sYS5j -b20KZHVwb2xhLm5ldAouZHVzaGkuY2EKfHxkdm9yYWsub3JnCi5kdy5jb20KfGh0 -dHA6Ly93d3cuZHcuY29tCnx8ZHcuZGUKLmR3LXdvcmxkLmNvbQp8fGR3LXdvcmxk -LmNvbQouZHctd29ybGQuZGUKfGh0dHA6Ly9kdy13b3JsZC5kZQp3d3cuZHdoZWVs -ZXIuY29tCmR3bmV3cy5jb20KfHxkd25ld3MuY29tCmR3bmV3cy5uZXQKfHxkd25l -d3MubmV0Cnh5cy5keGlvbmcuY29tCnx8ZHluYXdlYmluYy5jb20KLmR5bmRucy5v -cmcKLmR6emUuY29tCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1FRS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0KfHxlLWNsYXNzaWNhbC5jb20udHcKfHxlLWdvbGQuY29t -Ci5lLWdvbGQuY29tCnx8Zy5lLWhlbnRhaS5vcmcKfHxsb2ZpLmUtaGVudGFpLm9y -ZwplLWluZm8ub3JnLnR3Ci5lLXRyYWRlcmxhbmQubmV0L2JvYXJkCi5lLXpvbmUu -Y29tLmhrL2Rpc2N1egp8aHR0cDovL2Utem9uZS5jb20uaGsvZGlzY3V6Ci5lMTIz -LmhrCnxodHRwOi8vZTEyMy5oay8KLmVhcmx5dGliZXQuY29tCnxodHRwOi8vZWFy -bHl0aWJldC5jb20KLmVhcnRoY2FtLmNvbQouZWFydGh2cG4uY29tCmVhc3Rlcm4t -YXJrLmNvbQouZWFzdGVybmxpZ2h0bmluZy5vcmcKLmVhc3R0dXJrZXN0YW4uY29t -CnxodHRwOi8vd3d3LmVhc3R0dXJraXN0YW4ubmV0LwouZWFzdHR1cmtpc3Rhbi1n -b3Yub3JnCi5lYXN0dHVya2lzdGFuY2Mub3JnCi5lYXN0dHVya2lzdGFuZ292ZXJu -bWVudGluZXhpbGUudXMKfHxlYXN0dHVya2lzdGFuZ292ZXJubWVudGluZXhpbGUu -dXMKLmVhc3ljYS5jYQouZWFzeXBpYy5jb20KLmVib255LWJlYXV0eS5jb20KZWJv -b2ticm93c2UuY29tCmVib29rZWUuY29tCnx8ZWNmYS5vcmcudHcKZWNtaW5pc3Ry -eS5uZXQKLmVjb25vbWlzdC5jb20KYmJzLmVjc3RhcnQuY29tCnx8ZWRnZWNhc3Rj -ZG4ubmV0Ci90d2ltZ1wuZWRnZXN1aXRlXC5uZXRcL1wvP2FwcGxlZGFpbHkvCmVk -aWN5cGFnZXMuY29tCi5lZG1vbnRvbmNoaW5hLmNuCi5lZG1vbnRvbnNlcnZpY2Uu -Y29tCmVkb29ycy5jb20KLmVkdWJyaWRnZS5jb20KfHxlZHVicmlkZ2UuY29tCi5l -ZHVwcm8ub3JnCnx8ZWV2cG4uY29tCmVmY2Mub3JnLmhrCi5lZnVrdC5jb20KfGh0 -dHA6Ly9lZnVrdC5jb20KfHxlaWMtYXYuY29tCi5laXNiYi5jb20KLmVrc2lzb3ps -dWsuY29tCnx8ZWtzaXNvemx1ay5jb20KZWxlY3Rpb25zbWV0ZXIuY29tCnx8ZWxl -cGhhbnR2cG4uY29tCnx8ZWxnb29nLmltCnx8ZWxwYWlzLmNvbQouZWx0b25kaXNu -ZXkuY29tCi5lbWFnYS5jb20vaW5mby8zNDA3CmVtaWx5bGF1Lm9yZy5oawouZW1w +Z2UuY29tCi5jb3MtbW9lLmNvbQp8aHR0cDovL2Nvcy1tb2UuY29tCi5jb3NwbGF5 +amF2LnBsCnxodHRwOi8vY29zcGxheWphdi5wbAouY290d2VldC5jb20KfHxjb3R3 +ZWV0LmNvbQouY291cnNlaGVyby5jb20KfHxjb3Vyc2VoZXJvLmNvbQpjcGoub3Jn +Cnx8Y3BqLm9yZwouY3E5OS51cwp8aHR0cDovL2NxOTkudXMKY3JhY2tsZS5jb20K +fHxjcmFja2xlLmNvbQouY3JhenlzLmNjCi5jcmF6eXNoaXQuY29tCnx8Y3JjaGlu +YS5vcmcKY3JkLW5ldC5vcmcKY3JlYWRlcnMubmV0Cnx8Y3JlYWRlcnMubmV0Ci5j +cmVhZGVyc25ldC5jb20KfHxjcmlzdHlsaS5jb20KLmNyb2NvdHViZS5jb20KfGh0 +dHA6Ly9jcm9jb3R1YmUuY29tCi5jcm9zc3RoZXdhbGwubmV0Cnx8Y3Jvc3N0aGV3 +YWxsLm5ldAouY3Jvc3N2cG4ubmV0Cnx8Y3Jvc3N2cG4ubmV0Cnx8Y3J1Y2lhbC5j +b20KY3NkcGFydHkuY29tCnx8Y3NkcGFydHkuY29tCnx8Y3N1Y2hlbi5kZQouY3N3 +Lm9yZy51awouY3Qub3JnLnR3Cnx8Y3Qub3JnLnR3Ci5jdGFvLm9yZwouY3Rmcmll +bmQubmV0Ci5jdGl0di5jb20udHcKY3RzLmNvbS50dwp8aHR0cDovL2xpYnJhcnku +dXNjLmN1aGsuZWR1LmhrLwp8aHR0cDovL21qbHNoLnVzYy5jdWhrLmVkdS5oay8K +LmN1aGthY3Mub3JnL35iZW5uZwouY3VpaHVhLm9yZwp8fGN1aWh1YS5vcmcKLmN1 +aXdlaXBpbmcubmV0Cnx8Y3Vpd2VpcGluZy5uZXQKfHxjdWx0dXJlLnR3Ci5jdW1s +b3VkZXIuY29tCnx8Y3VtbG91ZGVyLmNvbQp8fGN1cnZlZmlzaC5jb20KLmN1c3Uu +aGsKfHxjdXN1LmhrCi5jdy5jb20udHcKfGh0dHA6Ly9mb3J1bS5jeWJlcmN0bS5j +b20KY3liZXJnaG9zdHZwbi5jb20KfHxjeWJlcmdob3N0dnBuLmNvbQp8fGN5bnNj +cmliZS5jb20KY3l0b2RlLnVzCnx8aWZhbi5jei5jYwp8fG1pa2UuY3ouY2MKfHxu +aWMuY3ouY2MKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLURELS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQouZC1mdWt5dS5jb20KfGh0dHA6Ly9kLWZ1a3l1LmNvbQpjbC5k +MHoubmV0Ci5kMTAwLm5ldAp8fGQxMDAubmV0Ci5kMmJheS5jb20KfGh0dHA6Ly9k +MmJheS5jb20KLmRhYnIuY28udWsKfHxkYWJyLmNvLnVrCmRhYnIuZXUKZGFici5t +b2JpCnx8ZGFici5tb2JpCnx8ZGFici5tZQpkYWRhemltLmNvbQp8fGRhZGF6aW0u +Y29tCi5kYWRpMzYwLmNvbQpkYWZhZ29vZC5jb20KZGFmYWhhby5jb20KLmRhZm9o +Lm9yZwouZGFnZWxpamtzZXN0YW5kYWFyZC5ubAouZGFpZG9zdHVwLnJ1CnxodHRw +Oi8vZGFpZG9zdHVwLnJ1Ci5kYWlsaWRhaWxpLmNvbQp8fGRhaWxpZGFpbGkuY29t +Ci5kYWlseW1vdGlvbi5jb20KfHxkYWlseW1vdGlvbi5jb20KZGFpcGhhcGluZm8u +bmV0Ci5kYWppeXVhbi5jb20KfHxkYWppeXVhbi5kZQpkYWppeXVhbi5ldQpkYWxh +aWxhbWEuY29tCi5kYWxhaWxhbWEubW4KfGh0dHA6Ly9kYWxhaWxhbWEubW4KLmRh +bGFpbGFtYS5ydQp8fGRhbGFpbGFtYS5ydQpkYWxhaWxhbWE4MC5vcmcKLmRhbGFp +bGFtYS1hcmNoaXZlcy5vcmcKLmRhbGFpbGFtYWNlbnRlci5vcmcKfGh0dHA6Ly9k +YWxhaWxhbWFjZW50ZXIub3JnCmRhbGFpbGFtYWZlbGxvd3Mub3JnCi5kYWxhaWxh +bWFmaWxtLmNvbQouZGFsYWlsYW1hZm91bmRhdGlvbi5vcmcKLmRhbGFpbGFtYWhp +bmRpLmNvbQouZGFsYWlsYW1haW5hdXN0cmFsaWEub3JnCi5kYWxhaWxhbWFqYXBh +bmVzZS5jb20KLmRhbGFpbGFtYXByb3Rlc3RlcnMuaW5mbwouZGFsYWlsYW1hcXVv +dGVzLm9yZwouZGFsYWlsYW1hdHJ1c3Qub3JnCi5kYWxhaWxhbWF2aXNpdC5vcmcu +bnoKLmRhbGFpbGFtYXdvcmxkLmNvbQp8fGRhbGFpbGFtYXdvcmxkLmNvbQpkYWxp +YW5tZW5nLm9yZwp8fGRhbGlhbm1lbmcub3JnCi5kYWxpdWxpYW4ub3JnCnx8ZGFs +aXVsaWFuLm9yZwouZGFua2U0Y2hpbmEubmV0Cnx8ZGFua2U0Y2hpbmEubmV0Ci5k +YW53ZWkub3JnCmRhb2xhbi5uZXQKLmRhb3pob25neGluZy5vcmcKZGFya3RveS5u +ZXQKfHxkYXN0cmFzc2kub3JnCmJsb2cuZGF1bS5uZXQvX2Jsb2cKLmRhdmlkLWtp +bGdvdXIuY29tCnxodHRwOi8vZGF2aWQta2lsZ291ci5jb20KZGF4YS5jbgp8fGRh +eGEuY24KY24uZGF5YWJvb2suY29tCi5kYXlsaWZlLmNvbS90b3BpYy9kYWxhaV9s +YW1hCnx8ZGIudHQKLmRiYy5oay9tYWluCnx8ZGNhcmQudHcKZGNtaWxpdGFyeS5j +b20KLmRkYy5jb20udHcKLmRkaHcuaW5mbwp8fGRlLXNjaS5vcmcKLmRlLXNjaS5v +cmcKcGFja2FnZXMuZGViaWFuLm9yZy96aC1jbi9sZW5ueS9ncGFzcwp8fGRlY29k +ZXQuY28KCiEtLU9yaWdpbjpjZG4taTMwJF8KIS0tRXhjZXB0aW9uOiBIb21lcGFn +ZSBhY2Nlc3Mgd2l0aG91dCByc3QKIS0tS2V5d29yZCBpcyAkXwouZGVmaW5lYmFi +ZS5jb20KCnx8ZGVsY2FtcC5uZXQKZGVsaWNpb3VzLmNvbS9HRldib29rbWFyawou +ZGVtb2NyYXRzLm9yZwp8fGRlbW9jcmF0cy5vcmcKfHxkZXNjLnNlCnx8ZGVzc2Np +LmNvbQouZGVzdHJveS1jaGluYS5qcAp8fGRldXRzY2hlLXdlbGxlLmRlCiEtLXx8 +ZGV2aWFudGFydC5jb20KIS0tfHxkZXZpYW50YXJ0Lm5ldAp8fGRldmlvLnVzCnx8 +ZGV2cG4uY29tCnx8ZGZhcy5taWwKZGZuLm9yZwpkaGFybWFrYXJhLm5ldAouZGhh +cmFtc2FsYW5ldC5jb20KLmRpYW95dWlzbGFuZHMub3JnCnx8ZGlhb3l1aXNsYW5k +cy5vcmcKfGh0dHA6Ly9kaWdpbGFuZC50dy8KfHxkaWdpdGFsbm9tYWRzcHJvamVj +dC5vcmcKLmRpaWdvLmNvbQp8fGRpaWdvLmNvbQp8fGRpbGJlci5zZQp8fGZ1cmwu +bmV0Ci5kaXBpdHkuY29tCnx8ZGlyZWN0Y3JlYXRpdmUuY29tCiEtLXx8ZGlzY29n +cy5jb20KIS0tQEB8fGNkbi5kaXNjb2dzLmNvbQp8aHR0cHM6Ly9zZWFyY2guZGlz +Y29ubmVjdC5tZQouZGlzY3Vzcy5jb20uaGsKfHxkaXNjdXNzLmNvbS5oawouZGlz +Y3VzczR1LmNvbQpkaXNwLmNjCi5kaXNxdXMuY29tCnx8ZGlzcXVzLmNvbQouZGl0 +LWluYy51cwp8fGRpdC1pbmMudXMKLmRpemhpZGl6aGkuY29tCnx8ZGl6aHV6aGlz +aGFuZy5jb20KZGphbmdvc25pcHBldHMub3JnCi5kam9yei5jb20KfHxkam9yei5j +b20KfHxkbC1sYWJ5LmpwCnx8ZGxzaXRlLmNvbQp8fGRseW91dHViZS5jb20KfHxk +bWNkbi5uZXQKLmRuc2NyeXB0Lm9yZwp8fGRuc2NyeXB0Lm9yZwp8fGRuczJnby5j +b20KfHxkbnNzZWMubmV0CmRvY3RvcnZvaWNlLm9yZwoKIS0tRG9nRmFydE5ldHdv +cmsKLmRvZ2ZhcnRuZXR3b3JrLmNvbS90b3VyCmdsb3J5aG9sZS5jb20KCi5kb2pp +bi5jb20KLmRvay1mb3J1bS5uZXQKfHxkb2xjLmRlCnx8ZG9sZi5vcmcuaGsKfHxk +b2xsZi5jb20KLmRvbWFpbi5jbHViLnR3Ci5kb21haW50b2RheS5jb20uYXUKY2hp +bmVzZS5kb25nYS5jb20KZG9uZ3RhaXdhbmcuY29tCnx8ZG9uZ3RhaXdhbmcuY29t +Ci5kb25ndGFpd2FuZy5uZXQKfHxkb25ndGFpd2FuZy5uZXQKLmRvbmd5YW5namlu +Zy5jb20KfGh0dHA6Ly9kYW5ib29ydS5kb25tYWkudXMKLmRvbnRmaWx0ZXIudXMK +fHxkb250bW92ZXRvY2hpbmEuY29tCi5kb3JqZXNodWdkZW4uY29tCi5kb3RwbGFu +ZS5jb20KfHxkb3RwbGFuZS5jb20KfHxkb3RzdWIuY29tCi5kb3R2cG4uY29tCnx8 +ZG90dnBuLmNvbQouZG91Yi5pbwp8fGRvdWIuaW8KfHxkb3Vnc2NyaXB0cy5jb20K +fHxkb3Vob2thbmtvLm5ldAp8fGRvdWppbmNhZmUuY29tCmRvd2VpLm9yZwpkcGhr +Lm9yZwpkcHAub3JnLnR3Cnx8ZHBwLm9yZy50dwp8fGRwci5pbmZvCnx8ZHJhZ29u +c3ByaW5ncy5vcmcKIS0tfHxkcmF3LmlvCi5kcmVhbWFtYXRldXJzLmNvbQouZHJl +cHVuZy5vcmcKfHxkcmdhbi5uZXQKLmRybWluZ3hpYS5vcmcKfGh0dHA6Ly9kcm1p +bmd4aWEub3JnCnx8ZHJvcGJvb2tzLnR2Cnx8ZHJvcGJveC5jb20KfHxhcGkuZHJv +cGJveGFwaS5jb20KfHxkcm9wYm94dXNlcmNvbnRlbnQuY29tCmRyc3VuYWNhZGVt +eS5jb20KLmRydHViZXIuY29tCi5kc2NuLmluZm8KfGh0dHA6Ly9kc2NuLmluZm8K +LmRzdGsuZGsKfGh0dHA6Ly9kc3RrLmRrCnx8ZHRpYmxvZy5jb20KfHxkdGljLm1p +bAouZHR3YW5nLm9yZwouZHVhbnpoaWh1LmNvbQouZHVja2Rucy5vcmcKfGh0dHA6 +Ly9kdWNrZG5zLm9yZwouZHVja2R1Y2tnby5jb20KfHxkdWNrZHVja2dvLmNvbQou +ZHVja2xvYWQuY29tL2Rvd25sb2FkCnx8ZHVja215bGlmZS5jb20KLmR1Z2EuanAK +fGh0dHA6Ly9kdWdhLmpwCi5kdWlodWEub3JnCnx8ZHVpaHVhLm9yZwp8fGR1aWh1 +YWhyam91cm5hbC5vcmcKLmR1bnlhYnVsdGVuaS5uZXQKLmR1b3dlaXRpbWVzLmNv +bQp8fGR1b3dlaXRpbWVzLmNvbQpkdXBpbmcubmV0Cnx8ZHVwbGljYXRpLmNvbQpk +dXBvbGEuY29tCmR1cG9sYS5uZXQKLmR1c2hpLmNhCnx8ZHZvcmFrLm9yZwouZHcu +Y29tCnx8ZHcuY29tCnx8ZHcuZGUKLmR3LXdvcmxkLmNvbQp8fGR3LXdvcmxkLmNv +bQouZHctd29ybGQuZGUKfGh0dHA6Ly9kdy13b3JsZC5kZQp3d3cuZHdoZWVsZXIu +Y29tCmR3bmV3cy5jb20KfHxkd25ld3MuY29tCmR3bmV3cy5uZXQKfHxkd25ld3Mu +bmV0Cnh5cy5keGlvbmcuY29tCnx8ZHluYXdlYmluYy5jb20KLmR6emUuY29tCgoh +LS0tLS0tLS0tLS0tLS0tLS0tLS1FRS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K +fHxlLWNsYXNzaWNhbC5jb20udHcKfHxlLWdvbGQuY29tCi5lLWdvbGQuY29tCi5l +LWhlbnRhaS5vcmcKfHxlLWhlbnRhaS5vcmcKLmUtaGVudGFpZGIuY29tCnxodHRw +Oi8vZS1oZW50YWlkYi5jb20KZS1pbmZvLm9yZy50dwouZS10cmFkZXJsYW5kLm5l +dC9ib2FyZAouZS16b25lLmNvbS5oay9kaXNjdXoKfGh0dHA6Ly9lLXpvbmUuY29t +LmhrL2Rpc2N1egouZTEyMy5oawp8fGUxMjMuaGsKLmVhcmx5dGliZXQuY29tCnxo +dHRwOi8vZWFybHl0aWJldC5jb20KLmVhcnRoY2FtLmNvbQouZWFydGh2cG4uY29t +Cnx8ZWFydGh2cG4uY29tCmVhc3Rlcm4tYXJrLmNvbQouZWFzdGVybmxpZ2h0bmlu +Zy5vcmcKLmVhc3R0dXJrZXN0YW4uY29tCnxodHRwOi8vd3d3LmVhc3R0dXJraXN0 +YW4ubmV0LwouZWFzdHR1cmtpc3Rhbi1nb3Yub3JnCi5lYXN0dHVya2lzdGFuY2Mu +b3JnCi5lYXN0dHVya2lzdGFuZ292ZXJubWVudGluZXhpbGUudXMKfHxlYXN0dHVy +a2lzdGFuZ292ZXJubWVudGluZXhpbGUudXMKLmVhc3ljYS5jYQouZWFzeXBpYy5j +b20KLmVib255LWJlYXV0eS5jb20KZWJvb2ticm93c2UuY29tCmVib29rZWUuY29t +Cnx8ZWNmYS5vcmcudHcKdXNodWFyZW5jaXR5LmVjaGFpbmhvc3QuY29tCnx8ZWNp +bWcudHcKZWNtaW5pc3RyeS5uZXQKLmVjb25vbWlzdC5jb20KYmJzLmVjc3RhcnQu +Y29tCnx8ZWRnZWNhc3RjZG4ubmV0Ci90d2ltZ1wuZWRnZXN1aXRlXC5uZXRcL1wv +P2FwcGxlZGFpbHkvCmVkaWN5cGFnZXMuY29tCi5lZG1vbnRvbmNoaW5hLmNuCi5l +ZG1vbnRvbnNlcnZpY2UuY29tCmVkb29ycy5jb20KLmVkdWJyaWRnZS5jb20KfHxl +ZHVicmlkZ2UuY29tCi5lZHVwcm8ub3JnCnx8ZWV2cG4uY29tCmVmY2Mub3JnLmhr +Ci5lZnVrdC5jb20KfGh0dHA6Ly9lZnVrdC5jb20KfHxlaWMtYXYuY29tCnx8ZWly +ZWluaWtvdGFlcnVrYWkuY29tCi5laXNiYi5jb20KLmVrc2lzb3psdWsuY29tCnx8 +ZWtzaXNvemx1ay5jb20KZWxlY3Rpb25zbWV0ZXIuY29tCnx8ZWxnb29nLmltCi5l +bHBhaXMuY29tCnx8ZWxwYWlzLmNvbQouZWx0b25kaXNuZXkuY29tCi5lbWFnYS5j +b20vaW5mby8zNDA3CmVtaWx5bGF1Lm9yZy5oawouZW1hbm5hLmNvbS9jaGluZXNl +VHJhZGl0aW9uYWwKYml0Yy5ibWUuZW1vcnkuZWR1L35semhvdS9ibG9ncwouZW1w ZmlsLmNvbQouZW11bGUtZWQyay5jb20KfGh0dHA6Ly9lbXVsZS1lZDJrLmNvbQou ZW11bGVmYW5zLmNvbQp8aHR0cDovL2VtdWxlZmFucy5jb20KLmVtdXBhcmFkaXNl -Lm1lCnx8ZW5ld3N0cmVlLmNvbQouZW5mYWwuZGUKY2hpbmVzZS5lbmdhZGdldC5j -b20KZW5nbGlzaGZvcmV2ZXJ5b25lLm9yZwp8fGVuZ2xpc2hmcm9tZW5nbGFuZC5j -by51awplbmdsaXNocGVuLm9yZwouZW5saWdodGVuLm9yZy50dwp8fGVudGVybWFw -LmNvbQouZW50bnQuY29tCnxodHRwOi8vZW50bnQuY29tCi5lcGlzY29wYWxjaHVy -Y2gub3JnCi5lcG9jaGhrLmNvbQp8aHR0cDovL2Vwb2NoaGsuY29tCmVwb2NodGlt -ZXMtYmcuY29tCnx8ZXBvY2h0aW1lcy1iZy5jb20KZXBvY2h0aW1lcy1yb21hbmlh -LmNvbQp8fGVwb2NodGltZXMtcm9tYW5pYS5jb20KZXBvY2h0aW1lcy5jby5pbAp8 -fGVwb2NodGltZXMuY28uaWwKZXBvY2h0aW1lcy5jby5rcgp8fGVwb2NodGltZXMu -Y28ua3IKZXBvY2h0aW1lcy5jb20KfHxlcG9jaHRpbWVzLmNvbQouZXBvY2h0aW1l -cy5jegplcG9jaHRpbWVzLmRlCmVwb2NodGltZXMuZnIKLmVwb2NodGltZXMuaWUK -LmVwb2NodGltZXMuaXQKZXBvY2h0aW1lcy5qcAplcG9jaHRpbWVzLnJ1CmVwb2No -dGltZXMuc2UKZXBvY2h0aW1lc3RyLmNvbQouZXBvY2h3ZWVrLmNvbQp8fGVwb2No -d2Vlay5jb20KfHxlcG9jaHdlZWtseS5jb20KLmVwb3JuZXIuY29tCi5lcXVpbmVu -b3cuY29tCmVyYWJhcnUubmV0Ci5lcmF5c29mdC5jb20udHIKLmVyZXB1Ymxpay5j -b20KLmVyaWdodHMubmV0Cnx8ZXJpZ2h0cy5uZXQKLmVya3R2LmNvbQp8aHR0cDov -L2Vya3R2LmNvbQp8fGVybmVzdG1hbmRlbC5vcmcKfHxlcm9kYWl6ZW5zeXUuY29t -Cnx8ZXJvZG91amlud29ybGQuY29tCnx8ZXJvbWFuZ2Eta2luZ2RvbS5jb20KfHxl -cm9tYW5nYWRvdXppbi5jb20KLmVyb21vbi5uZXQKfGh0dHA6Ly9lcm9tb24ubmV0 -Ci5lcm9wcm9maWxlLmNvbQouZXJvdGljc2Fsb29uLm5ldAouZXNsaXRlLmNvbS9w -cm9kdWN0Ci5lc2xpdGUuY29tL1NlYXJjaF9CVy5hc3B4P3EKd2lraS5lc3UuaW0v -JUU4JTlCJUE0JUU4JTlCJUE0JUU4JUFGJUFEJUU1JUJEJTk1Ci5ldGFhLm9yZy5h -dQouZXRhZHVsdC5jb20KZXRhaXdhbm5ld3MuY29tCnx8ZXRpemVyLm9yZwp8fGV0 -b2traS5jb20KLmV0dG9kYXkubmV0CmV0dm9ubGluZS5oawouZXUub3JnCnx8ZXUu -b3JnCi5ldWNhc2luby5jb20KLmV1bGFtLmNvbQplZWFzLmV1cm9wYS5ldS9kZWxl -Z2F0aW9ucy9jaGluYS9wcmVzc19jb3JuZXIvYWxsX25ld3MvbmV3cy8yMDE1LzIw -MTUwNzE2X3poCmVlYXMuZXVyb3BhLmV1L3N0YXRlbWVudHMtZWVhcy8yMDE1LzE1 -MTAyMgouZXZzY2hvb2wubmV0CnxodHRwOi8vZXZzY2hvb2wubmV0Cnx8ZXhibG9n -LmpwCnx8YmxvZy5leGJsb2cuY28uanAKQEB8fHd3dy5leGJsb2cuanAKLmV4Y2hy -aXN0aWFuLmhrCnx8ZXhjaHJpc3RpYW4uaGsKfGh0dHA6Ly9ibG9nLmV4Y2l0ZS5j -by5qcAp8fGV4bW9ybW9uLm9yZwp8fGV4cGF0c2hpZWxkLmNvbQpleHBlcnRzLXVu -aXZlcnMuY29tCnx8ZXhwbG9hZGVyLm5ldAouZXhwcmVzc3Zwbi5jb20KfGh0dHA6 -Ly9leHByZXNzdnBuLmNvbQouZXh0cmVtZXR1YmUuY29tCmV5ZXZpby5qcAp8fGV5 -ZXZpby5qcAouZXlueS5jb20KfHxleW55LmNvbQouZXpwYy50ay9jYXRlZ29yeS9z -b2Z0Ci5lenBlZXIuY29tCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1GRi0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0KfHxmYWNlYm9va3F1b3RlczR1LmNvbQouZmFjZWxl -c3MubWUKfHxmYWNlbGVzcy5tZQp8aHR0cDovL2ZhY2Vzb2Z0aWJldGFuc2VsZmlt -bW9sYXRvcnMuaW5mbwp8fGZhY2Vzb2ZueWZ3LmNvbQouZmFpdGgxMDAub3JnCnxo -dHRwOi8vZmFpdGgxMDAub3JnCgohLS1FbmhhbmNlbWVudDoKIS0taHR0cDovL2Zh -aXRoZnVsZXllLmNvbS5kZXRhaWwud2Vic2l0ZS8KIS0taHR0cDovL2ZhaXRoZnVs -ZXllLmNvbS5pcGFkZHJlc3MuY29tLwouZmFpdGhmdWxleWUuY29tCgp8fGZhaXRo -dGhlZG9nLmluZm8KLmZha2t1Lm5ldAouZmFsc2VmaXJlLmNvbQp8fGZhbHNlZmly -ZS5jb20KZmFsdW4tY28ub3JnCmZhbHVuYXJ0Lm9yZwp8fGZhbHVuYXNpYS5pbmZv -CmZhbHVuZGFmYS5vcmcKZmFsdW5kYWZhLWRjLm9yZwp8fGZhbHVuZGFmYS1mbG9y -aWRhLm9yZwp8fGZhbHVuZGFmYS1uYy5vcmcKfHxmYWx1bmRhZmEtcGEubmV0CmZh -bHVuLW55Lm5ldAp8fGZhbHVuZGFmYWluZGlhLm9yZwpmYWx1bmRhZmFtdXNldW0u -b3JnCi5mYWx1bmdvbmcuZGUKZmFsdW5nb25nLm9yZy51awp8fGZhbHVuaHIub3Jn -CmZhbHVuaW5mby5kZQpmYWx1bmluZm8ubmV0Ci5mYWx1bnBpbGlwaW5hcy5uZXQK -fHxmYWx1bndvcmxkLm5ldApmYW1pbHlmZWQub3JnCnx8ZmFuZ2xpemhpLmluZm8K -fHxmYW5nb25nLm9yZwpmYW5nb25naGVpa2UuY29tCi5mYW5xaWFuZy50awpmYW5x -aWFuZ2hvdS5jb20KfHxmYW5xaWFuZ2hvdS5jb20KLmZhbnFpYW5nemhlLmNvbQp8 -fGZhbnFpYW5nemhlLmNvbQpmYXBkdS5jb20KZmFwcm94eS5jb20KIS0tLmZhcnhp -YW4uY29tCi5mYXdhbmdodWlodWkub3JnCnx8ZmJjZG4ubmV0CmZhbnFpYW5neWFr -ZXhpLm5ldApmYWlsLmhrCnx8ZmFtdW5pb24uY29tCi5mYW4tcWlhbmcuY29tCi5m -YW5nYmlueGluZy5jb20KfHxmYW5nYmlueGluZy5jb20KZmFuZ2VtaW5nLmNvbQou -ZmFuZ21pbmNuLm9yZwp8fGZhbmdtaW5jbi5vcmcKfHxmYW5zd29uZy5jb20KLmZh -bnl1ZS5pbmZvCi5mYXJ3ZXN0Y2hpbmEuY29tCgohLS1GYXN0bHkKZW4uZmF2b3R0 -ZXIubmV0CiEtLXx8cm53Lmdsb2JhbC5zc2wuZmFzdGx5Lm5ldAohLS18aHR0cHM6 -Ly8qZ2xvYmFsLnNzbC5mYXN0bHkubmV0Lwp8fGZhc3Qud2lzdGlhLmNvbQoKfHxm -YXN0c3NoLmNvbQp8fGZhc3RzdG9uZS5vcmcKZmF2c3Rhci5mbQp8fGZhdnN0YXIu -Zm0KZmF5ZGFvLmNvbS93ZWJsb2cKfHxmYnNieC5jb20KZmMyLmNvbQouZmMyY2hp -bmEuY29tCi5mYzJjbi5jb20KfHxmYzJjbi5jb20KZmMyYmxvZy5uZXQKfGh0dHA6 -Ly91eWd1ci5mYzJ3ZWIuY29tLwp2aWRlby5mZGJveC5jb20KLmZkYzg5LmpwCnx8 -Zm91cmZhY2Uubm9kZXNub29wLmNvbQohLS1mZWVkYm9va3MubW9iaQp8fGZlZWxz -c2guY29tCmZlZXIuY29tCi5mZWlmZWlzcy5jb20KfGh0dHA6Ly9mZWl0aWFuYWNh -ZGVteS5vcmcKLmZlaXRpYW4tY2FsaWZvcm5pYS5vcmcKfHxmZW1pbmlzdHRlYWNo -ZXIuY29tCi5mZW5nemhlbmdodS5jb20KfHxmZW5nemhlbmdodS5jb20KLmZlbmd6 -aGVuZ2h1Lm5ldAp8fGZlbmd6aGVuZ2h1Lm5ldAouZmV2ZXJuZXQuY29tCnxodHRw -Oi8vZmYuaW0KZmZmZmYuYXQKZmZsaWNrLmNvbQpmZ210di5uZXQKLmZnbXR2Lm9y -ZwouZmhyZXBvcnRzLm5ldAp8aHR0cDovL2ZocmVwb3J0cy5uZXQKLmZpbGVmbHll -ci5jb20KfHxmaWxlZmx5ZXIuY29tCnxodHRwOi8vZmVlZHMuZmlsZWZvcnVtLmNv -bQouZmlsZXMybWUuY29tCi5maWxlc2VydmUuY29tL2ZpbGUKZmlsbHRoZXNxdWFy -ZS5vcmcKZmlsbWluZ2ZvcnRpYmV0Lm9yZwouZmlsdGhkdW1wLmNvbQp8fGZpbmFs -aW9uLmpwCi5maW5jaHZwbi5jb20KfHxmaW5jaHZwbi5jb20KIS0tZmluZGJvb2su -dHcKZmluZG1lc3BvdC5jb20KLmZpbmdlcmRhaWx5LmNvbQpmaW5sZXIubmV0Ci5m -aXJlZm94ZmFuLmNjCnxodHRwOi8vZmlyZWZveGZhbi5jYwouZmlyZW9mbGliZXJ0 -eS5vcmcKfHxmaXJlb2ZsaWJlcnR5Lm9yZwouZmlyZXR3ZWV0LmlvCnx8ZmlyZXR3 -ZWV0LmlvCiEtLXx8ZmxhZ2ZveC5uZXQKLmZsYWdzb25saW5lLml0CmZsZXNoYm90 -LmNvbQouZmxldXJzZGVzbGV0dHJlcy5jb20KfGh0dHA6Ly9mbGV1cnNkZXNsZXR0 -cmVzLmNvbQp8fGZsZ2cudXMKCiEtLXx8ZmFybTYuc3RhdGljZmxpY2tyLmNvbQoh -LS0uZmxpY2tyLmNvbS9waG90b3MvNDYyMzEwNzdATjA2CiEtLS5mbGlja3IuY29t -L2dyb3Vwcy9haXdlaXdlaQohLS0uZmxpY2tyLmNvbS9waG90b3MvZGlnaXRhbGJv -eTEwMAohLS0uZmxpY2tyLmNvbS9waG90b3MvZnpoZW5naHUKIS0tLmZsaWNrci5j -b20vcGhvdG9zL2xvbmVseWZveAohLS1mbGlja3IuY29tL3Bob3Rvcy92YW52YW4v -NTI5OTI1MTU3CiEtLS5mbGlja3IuY29tL3Bob3Rvcy93aW50ZXJrYW5hbAohLS0u -ZmxpY2tyLmNvbS9waG90b3Mvem9sYQp8fGZsaWNrci5jb20KfHxzdGF0aWNmbGlj -a3IuY29tCgpmbGlja3JoaXZlbWluZC5uZXQKLmZsaW5nLmNvbQp8fGZsaXBrYXJ0 -LmNvbQp8aHR0cDovL2NuLmZtbm5vdy5jb20KZm9mbGRmcmFkaW8ub3JnCmJsb2cu -Zm9vbHNtb3VudGFpbi5jb20KLmZvcnVtNGhrLmNvbQpmYW5nb25nLmZvcnVtcy1m -cmVlLmNvbQpwaW9uZWVyLXdvcmtlci5mb3J1bXMtZnJlZS5jb20KIS0tZm91cnNx -dWFyZS5jb20KIS0tfGh0dHA6Ly80c3EuY29tCnxodHRwczovL3NzKi40c3FpLm5l -dAp8fGZvdG9wLm5ldAp2aWRlby5mb3hidXNpbmVzcy5jb20KfGh0dHA6Ly9mb3hn -YXkuY29tCnx8ZnJpbmdlbmV0d29yay5jb20KfHxmbGVjaGVpbnRoZXBlY2hlLmZy -Ci5mb2Noay5vcmcKfGh0dHA6Ly9mb2Noay5vcmcKfHxmb2N1c3RhaXdhbi50dwou -Zm9jdXN2cG4uY29tCnx8Zm9mZy5vcmcKLmZvZmctZXVyb3BlLm5ldAouZm9vb29v -LmNvbQp8fGZvb29vby5jb20KZm9vdHdpYmFsbC5jb20KLmZvdGlsZS5tZQp8fGZv -dXJ0aGludGVybmF0aW9uYWwub3JnCnx8Zm94ZGllLnVzCnx8Zm94c3ViLmNvbQpm -b3h0YW5nLmNvbQouZnBtdC5vcmcKfGh0dHA6Ly9mcG10Lm9yZwouZnBtdC50dwou -ZnBtdC1vc2VsLm9yZwp8fGZwbXRtZXhpY28ub3JnCmZxb2sub3JnCnx8ZnFyb3V0 -ZXIuY29tCnx8ZnJhbmtsYy5jb20KLmZyZWFrc2hhcmUuY29tCnxodHRwOi8vZnJl -YWtzaGFyZS5jb20KfHxmcmVlNHUuY29tLmFyCmZyZWUtZ2F0ZS5vcmcKLmZyZWUu -ZnIvYWRzbAp8fGFsbG9ubGludXguZnJlZS5mcgp8fGRpbWl0cmlrLmZyZWUuZnIK -a2luZW94LmZyZWUuZnIKfHxwdXR0eWNtLmZyZWUuZnIKfHxmcmVlYWxpbS5jb20K -d2hpdGViZWFyLmZyZWViZWFyYmxvZy5vcmcKfHxmcmVlYnJvd3Nlci5vcmcKLmZy -ZWVjaGFsLmNvbQouZnJlZWRvbWNoaW5hLmluZm8KfHxmcmVlZG9tY2hpbmEuaW5m -bwouZnJlZWRvbWhvdXNlLm9yZwp8fGZyZWVkb21ob3VzZS5vcmcKLmZyZWVkb21z -aGVyYWxkLm9yZwp8fGZyZWVkb21zaGVyYWxkLm9yZwouZnJlZWZxLmNvbQouZnJl -ZWZ1Y2t2aWRzLmNvbQouZnJlZWdhby5jb20KfHxmcmVlZ2FvLmNvbQouZnJlZS1o -YWRhLW5vdy5vcmcKZnJlZWlsaGFtdG9odGkub3JnCi5mcmVlbG90dG8uY29tCnx8 -ZnJlZWxvdHRvLmNvbQpmcmVlbWFuMi5jb20KLmZyZWVvcGVudnBuLmNvbQpmcmVl -bW9yZW4uY29tCmZyZWVtb3JlbmV3cy5jb20KZnJlZW11c2Uub3JnL2FyY2hpdmVz -Lzc4OQpmcmVlbmV0LWNoaW5hLm9yZwpmcmVlbmV3c2NuLmNvbQpjbi5mcmVlb25l -cy5jb20KLmZyZWVvei5vcmcvYmJzCnx8ZnJlZW96Lm9yZwp8fGZyZWVzc2gudXMK -ZnJlZTR1LmNvbS5hcgouZnJlZS1zc2guY29tCnx8ZnJlZS1zc2guY29tCi5mcmVl -ZG9tY29sbGVjdGlvbi5vcmcvaW50ZXJ2aWV3cy9yZWJpeWFfa2FkZWVyCi5mcmVl -Zm9ydW1zLm9yZwp8fGZyZWVuZXRwcm9qZWN0Lm9yZwouZnJlZW96Lm9yZwouZnJl -ZXRpYmV0Lm5ldAp8fGZyZWV0aWJldC5vcmcKLmZyZWV0aWJldGFuaGVyb2VzLm9y -Zwp8aHR0cDovL2ZyZWV0aWJldGFuaGVyb2VzLm9yZwouZnJlZXZpZXdtb3ZpZXMu -Y29tCi5mcmVldnBuLm1lCnxodHRwOi8vZnJlZXZwbi5tZQp8fGZyZWV3YWxscGFw -ZXI0Lm1lCi5mcmVld2Vicy5jb20KLmZyZWV3ZWNoYXQuY29tCnx8ZnJlZXdlY2hh -dC5jb20KZnJlZXdlaWJvLmNvbQp8fGZyZWV3ZWliby5jb20KLmZyZWV4aW53ZW4u -Y29tCi5mcmVleW91dHViZXByb3h5Lm5ldAp8fGZyZWV5b3V0dWJlcHJveHkubmV0 -CmZyaWVuZGZlZWQuY29tCmZyaWVuZGZlZWQtbWVkaWEuY29tL2U5OWE0ZWJlMmZi -NGMxOTg1YzJhNTg3NzVlYjQ0MjI5NjFhYTVhMmUKZnJpZW5kcy1vZi10aWJldC5v -cmcKLmZyaWVuZHNvZnRpYmV0Lm9yZwpmcmVlY2hpbmEubmV0CnxodHRwOi8vd3d3 -LnplbnN1ci5mcmVlcmsuY29tLwpmcmVldnBuLm5sCmZyZWV5ZWxsb3cuY29tCmhr -LmZyaWVuZGR5LmNvbS9oawp8aHR0cDovL2FkdWx0LmZyaWVuZGZpbmRlci5jb20v -Ci5mcmluZy5jb20KfHxmcmluZy5jb20KLmZyb21jaGluYXRvdXNhLm5ldAp8fGZy -b21tZWwubmV0Ci5mcm9udGxpbmVkZWZlbmRlcnMub3JnCnx8ZnNja2VkLm9yZwou -ZnN1cmYuY29tCi5mdGNoaW5lc2UuY29tL2NoYW5uZWwvdmlkZW8KLmZ0Y2hpbmVz -ZS5jb20vc3RvcnkvMDAxMDI3NTMKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDI2 -ODA3Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzMjY5MgouZnRjaGluZXNlLmNv -bS9zdG9yeS8wMDEwMzcwOTAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM3MDkx -Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzODIyMAouZnRjaGluZXNlLmNvbS9z -dG9yeS8wMDEwNDA4OTAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQyMTAwCi5m -dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MjI1MgouZnRjaGluZXNlLmNvbS9zdG9y -eS8wMDEwNDIyNzIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ0Nzc2Ci5mdGNo -aW5lc2UuY29tL3N0b3J5LzAwMTA0NTc1NQouZnRjaGluZXNlLmNvbS9zdG9yeS8w -MDEwNDYxMTgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ3MzQ1Ci5mdGNoaW5l -c2UuY29tL3N0b3J5LzAwMTA0NzM3NQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw -NDc1NDUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ4NzEwCi5mdGNoaW5lc2Uu -Y29tL3N0b3J5LzAwMTA0OTM2MAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTI5 -NjUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUzNTI2Ci5mdGNoaW5lc2UuY29t -L3N0b3J5LzAwMTA1NDEwMwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQxNjgK -LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU0NTI2Ci5mdGNoaW5lc2UuY29tL3N0 -b3J5LzAwMTA1NDY0NAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTUyOTkKLmZ0 -Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU1NTUxCi5mdGNoaW5lc2UuY29tL3N0b3J5 -LzAwMTA1NjUyOQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY1NTQKLmZ0Y2hp -bmVzZS5jb20vc3RvcnkvMDAxMDU2NTg4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAw -MTA1NjU2NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTc1MDkKLmZ0Y2hpbmVz -ZS5jb20vc3RvcnkvMDAxMDU3NTMzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1 -ODI5NQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTgzNDQKLmZ0Y2hpbmVzZS5j -b20vc3RvcnkvMDAxMDU4NDU4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODQ2 -OAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg1NjEKLmZ0Y2hpbmVzZS5jb20v -c3RvcnkvMDAxMDU4NTY2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODU2Nwou -ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg1ODUKLmZ0Y2hpbmVzZS5jb20vc3Rv -cnkvMDAxMDU4NjI4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODY3OAouZnRj -aGluZXNlLmNvbS9zdG9yeS8wMDEwNTk0ODQKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv -MDAxMDU5NTM4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1OTgxOAouZnRjaGlu -ZXNlLmNvbS9zdG9yeS8wMDEwNTk5MTQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx -MDU5OTIwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MDE4MQouZnRjaGluZXNl +Lm1lCi5lbmFueWFuZy5teQohLS0uZW5hbnlhbmcubXkvbmV3cy8yMDE3MDUwMi8l +RTclQkUlOEUlRTUlOUIlQkQlRTQlQjklOEIlRTklOUYlQjMlRTUlQTQlQTclRTUl +OUMlQjAlRTklOUMlODclRTMlODAlOEElRTglOEIlQjklRTYlOUUlOUMlRTMlODAl +OEIlRTclOEIlQUMlRTUlQUUlQjYKfHxlbmV3c3RyZWUuY29tCi5lbmZhbC5kZQpj +aGluZXNlLmVuZ2FkZ2V0LmNvbQp8fGVuZ2FnZWRhaWx5Lm9yZwplbmdsaXNoZm9y +ZXZlcnlvbmUub3JnCnx8ZW5nbGlzaGZyb21lbmdsYW5kLmNvLnVrCmVuZ2xpc2hw +ZW4ub3JnCi5lbmxpZ2h0ZW4ub3JnLnR3Cnx8ZW50ZXJtYXAuY29tCi5lbnRudC5j +b20KfGh0dHA6Ly9lbnRudC5jb20KLmVwaXNjb3BhbGNodXJjaC5vcmcKLmVwb2No +aGsuY29tCnxodHRwOi8vZXBvY2hoay5jb20KZXBvY2h0aW1lcy1iZy5jb20KfHxl +cG9jaHRpbWVzLWJnLmNvbQplcG9jaHRpbWVzLXJvbWFuaWEuY29tCnx8ZXBvY2h0 +aW1lcy1yb21hbmlhLmNvbQplcG9jaHRpbWVzLmNvLmlsCnx8ZXBvY2h0aW1lcy5j +by5pbAplcG9jaHRpbWVzLmNvLmtyCnx8ZXBvY2h0aW1lcy5jby5rcgplcG9jaHRp +bWVzLmNvbQp8fGVwb2NodGltZXMuY29tCi5lcG9jaHRpbWVzLmN6CmVwb2NodGlt +ZXMuZGUKZXBvY2h0aW1lcy5mcgouZXBvY2h0aW1lcy5pZQouZXBvY2h0aW1lcy5p +dAplcG9jaHRpbWVzLmpwCmVwb2NodGltZXMucnUKZXBvY2h0aW1lcy5zZQplcG9j +aHRpbWVzdHIuY29tCi5lcG9jaHdlZWsuY29tCnx8ZXBvY2h3ZWVrLmNvbQp8fGVw +b2Nod2Vla2x5LmNvbQouZXBvcm5lci5jb20KLmVxdWluZW5vdy5jb20KZXJhYmFy +dS5uZXQKLmVyYWNvbS5jb20udHcKLmVyYXlzb2Z0LmNvbS50cgouZXJlcHVibGlr +LmNvbQouZXJpZ2h0cy5uZXQKfHxlcmlnaHRzLm5ldAouZXJrdHYuY29tCnxodHRw +Oi8vZXJrdHYuY29tCnx8ZXJuZXN0bWFuZGVsLm9yZwp8fGVyb2RhaXplbnN5dS5j +b20KfHxlcm9kb3VqaW5sb2cuY29tCnx8ZXJvZG91amlud29ybGQuY29tCnx8ZXJv +bWFuZ2Eta2luZ2RvbS5jb20KfHxlcm9tYW5nYWRvdXppbi5jb20KLmVyb21vbi5u +ZXQKfGh0dHA6Ly9lcm9tb24ubmV0Ci5lcm9wcm9maWxlLmNvbQouZXJvdGljc2Fs +b29uLm5ldAouZXNsaXRlLmNvbS9wcm9kdWN0Ci5lc2xpdGUuY29tL1NlYXJjaF9C +Vy5hc3B4P3EKd2lraS5lc3UuaW0vJUU4JTlCJUE0JUU4JTlCJUE0JUU4JUFGJUFE +JUU1JUJEJTk1Ci5ldGFhLm9yZy5hdQouZXRhZHVsdC5jb20KZXRhaXdhbm5ld3Mu +Y29tCnx8ZXRpemVyLm9yZwp8fGV0b2traS5jb20KIS0tLmV0dG9kYXkubmV0Ci5l +dHRvZGF5Lm5ldC9uZXdzLzIwMTUxMjE2LzYxNDA4MQpldHZvbmxpbmUuaGsKLmV1 +Lm9yZwp8fGV1Lm9yZwouZXVjYXNpbm8uY29tCi5ldWxhbS5jb20KLmV1cmVrYXZw +dC5jb20KfHxldXJla2F2cHQuY29tCmVlYXMuZXVyb3BhLmV1L2RlbGVnYXRpb25z +L2NoaW5hL3ByZXNzX2Nvcm5lci9hbGxfbmV3cy9uZXdzLzIwMTUvMjAxNTA3MTZf +emgKZWVhcy5ldXJvcGEuZXUvc3RhdGVtZW50cy1lZWFzLzIwMTUvMTUxMDIyCi5l +dnNjaG9vbC5uZXQKfGh0dHA6Ly9ldnNjaG9vbC5uZXQKfHxleGJsb2cuanAKfHxi +bG9nLmV4YmxvZy5jby5qcApAQHx8d3d3LmV4YmxvZy5qcAouZXhjaHJpc3RpYW4u +aGsKfHxleGNocmlzdGlhbi5oawp8aHR0cDovL2Jsb2cuZXhjaXRlLmNvLmpwCnx8 +ZXhtb3Jtb24ub3JnCnx8ZXhwYXRzaGllbGQuY29tCi5leHBlY3RoaW0uY29tCnx8 +ZXhwZWN0aGltLmNvbQpleHBlcnRzLXVuaXZlcnMuY29tCnx8ZXhwbG9hZGVyLm5l +dAouZXhwcmVzc3Zwbi5jb20KfHxleHByZXNzdnBuLmNvbQouZXh0cmVtZXR1YmUu +Y29tCmV5ZXZpby5qcAp8fGV5ZXZpby5qcAouZXlueS5jb20KfHxleW55LmNvbQou +ZXpwYy50ay9jYXRlZ29yeS9zb2Z0Ci5lenBlZXIuY29tCgohLS0tLS0tLS0tLS0t +LS0tLS0tLS1GRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfHxmYWNlYm9va3F1 +b3RlczR1LmNvbQouZmFjZWxlc3MubWUKfHxmYWNlbGVzcy5tZQp8aHR0cDovL2Zh +Y2Vzb2Z0aWJldGFuc2VsZmltbW9sYXRvcnMuaW5mbwp8fGZhY2Vzb2ZueWZ3LmNv +bQouZmFpdGgxMDAub3JnCnxodHRwOi8vZmFpdGgxMDAub3JnCgohLS1FbmhhbmNl +bWVudDoKIS0taHR0cDovL2ZhaXRoZnVsZXllLmNvbS5kZXRhaWwud2Vic2l0ZS8K +IS0taHR0cDovL2ZhaXRoZnVsZXllLmNvbS5pcGFkZHJlc3MuY29tLwouZmFpdGhm +dWxleWUuY29tCgp8fGZhaXRodGhlZG9nLmluZm8KLmZha2t1Lm5ldAouZmFsc2Vm +aXJlLmNvbQp8fGZhbHNlZmlyZS5jb20KZmFsdW4tY28ub3JnCmZhbHVuYXJ0Lm9y +Zwp8fGZhbHVuYXNpYS5pbmZvCnxodHRwOi8vZmFsdW5hdS5vcmcKLmZhbHVuYXou +bmV0CmZhbHVuZGFmYS5vcmcKZmFsdW5kYWZhLWRjLm9yZwp8fGZhbHVuZGFmYS1m +bG9yaWRhLm9yZwp8fGZhbHVuZGFmYS1uYy5vcmcKfHxmYWx1bmRhZmEtcGEubmV0 +Cnx8ZmFsdW5kYWZhLXNhY3JhbWVudG8ub3JnCmZhbHVuLW55Lm5ldAp8fGZhbHVu +ZGFmYWluZGlhLm9yZwpmYWx1bmRhZmFtdXNldW0ub3JnCi5mYWx1bmdvbmcuY2x1 +YgouZmFsdW5nb25nLmRlCmZhbHVuZ29uZy5vcmcudWsKfHxmYWx1bmhyLm9yZwpm +YWx1bmluZm8uZGUKZmFsdW5pbmZvLm5ldAouZmFsdW5waWxpcGluYXMubmV0Cnx8 +ZmFsdW53b3JsZC5uZXQKZmFtaWx5ZmVkLm9yZwouZmFuZ2VtaW5nLmNvbQp8fGZh +bmdsaXpoaS5pbmZvCnx8ZmFuZ29uZy5vcmcKZmFuZ29uZ2hlaWtlLmNvbQouZmFu +cWlhbmcudGsKZmFucWlhbmdob3UuY29tCnx8ZmFucWlhbmdob3UuY29tCi5mYW5x +aWFuZ3poZS5jb20KfHxmYW5xaWFuZ3poZS5jb20KZmFwZHUuY29tCmZhcHJveHku +Y29tCiEtLS5mYXJ4aWFuLmNvbQouZmF3YW5naHVpaHVpLm9yZwpmYW5xaWFuZ3lh +a2V4aS5uZXQKZmFpbC5oawp8fGZhbXVuaW9uLmNvbQouZmFuLXFpYW5nLmNvbQou +ZmFuZ2JpbnhpbmcuY29tCnx8ZmFuZ2JpbnhpbmcuY29tCmZhbmdlbWluZy5jb20K +LmZhbmdtaW5jbi5vcmcKfHxmYW5nbWluY24ub3JnCi5mYW5oYW9kYW5nLmNvbQp8 +fGZhbnN3b25nLmNvbQouZmFueXVlLmluZm8KLmZhcndlc3RjaGluYS5jb20KCiEt +LUZhc3RseQplbi5mYXZvdHRlci5uZXQKIS0tfHxybncuZ2xvYmFsLnNzbC5mYXN0 +bHkubmV0CiEtLXxodHRwczovLypnbG9iYWwuc3NsLmZhc3RseS5uZXQvCm55dGlt +ZXMubWFwLmZhc3RseS5uZXQKfHxueXRpbWVzLm1hcC5mYXN0bHkubmV0Cnx8ZmFz +dC53aXN0aWEuY29tCgp8fGZhc3Rzc2guY29tCnx8ZmFzdHN0b25lLm9yZwpmYXZz +dGFyLmZtCnx8ZmF2c3Rhci5mbQpmYXlkYW8uY29tL3dlYmxvZwp8fGZic2J4LmNv +bQouZmMyLmNvbQouZmMyY2hpbmEuY29tCi5mYzJjbi5jb20KfHxmYzJjbi5jb20K +ZmMyYmxvZy5uZXQKfGh0dHA6Ly91eWd1ci5mYzJ3ZWIuY29tLwp2aWRlby5mZGJv +eC5jb20KLmZkYzY0LmRlCi5mZGM2NC5vcmcKLmZkYzg5LmpwCnx8Zm91cmZhY2Uu +bm9kZXNub29wLmNvbQohLS1mZWVkYm9va3MubW9iaQp8fGZlZWxzc2guY29tCmZl +ZXIuY29tCi5mZWlmZWlzcy5jb20KfGh0dHA6Ly9mZWl0aWFuYWNhZGVteS5vcmcK +LmZlaXRpYW4tY2FsaWZvcm5pYS5vcmcKfHxmZW1pbmlzdHRlYWNoZXIuY29tCi5m +ZW5nemhlbmdodS5jb20KfHxmZW5nemhlbmdodS5jb20KLmZlbmd6aGVuZ2h1Lm5l +dAp8fGZlbmd6aGVuZ2h1Lm5ldAouZmV2ZXJuZXQuY29tCnxodHRwOi8vZmYuaW0K +ZmZmZmYuYXQKZmZsaWNrLmNvbQouZmZ2cG4uY29tCmZnbXR2Lm5ldAouZmdtdHYu +b3JnCi5maHJlcG9ydHMubmV0CnxodHRwOi8vZmhyZXBvcnRzLm5ldAouZmlncHJh +eWVyLmNvbQp8fGZpZ3ByYXllci5jb20KLmZpbGVmbHllci5jb20KfHxmaWxlZmx5 +ZXIuY29tCnxodHRwOi8vZmVlZHMuZmlsZWZvcnVtLmNvbQouZmlsZXMybWUuY29t +Ci5maWxlc2VydmUuY29tL2ZpbGUKZmlsbHRoZXNxdWFyZS5vcmcKZmlsbWluZ2Zv +cnRpYmV0Lm9yZwouZmlsdGhkdW1wLmNvbQouZmluY2h2cG4uY29tCnx8ZmluY2h2 +cG4uY29tCiEtLWZpbmRib29rLnR3CmZpbmRtZXNwb3QuY29tCnx8ZmluZHlvdXR1 +YmUuY29tCi5maW5nZXJkYWlseS5jb20KZmlubGVyLm5ldAouZmlyZWFybXN3b3Js +ZC5uZXQKfGh0dHA6Ly9maXJlYXJtc3dvcmxkLm5ldAouZmlyZW9mbGliZXJ0eS5v +cmcKfHxmaXJlb2ZsaWJlcnR5Lm9yZwouZmlyZXR3ZWV0LmlvCnx8ZmlyZXR3ZWV0 +LmlvCiEtLXx8ZmxhZ2ZveC5uZXQKLmZsYWdzb25saW5lLml0CmZsZXNoYm90LmNv +bQouZmxldXJzZGVzbGV0dHJlcy5jb20KfGh0dHA6Ly9mbGV1cnNkZXNsZXR0cmVz +LmNvbQp8fGZsZ2cudXMKfHxmbGdqdXN0aWNlLm9yZwoKIS0tfHxmYXJtNi5zdGF0 +aWNmbGlja3IuY29tCiEtLS5mbGlja3IuY29tL3Bob3Rvcy80NjIzMTA3N0BOMDYK +IS0tLmZsaWNrci5jb20vZ3JvdXBzL2Fpd2Vpd2VpCiEtLS5mbGlja3IuY29tL3Bo +b3Rvcy9kaWdpdGFsYm95MTAwCiEtLS5mbGlja3IuY29tL3Bob3Rvcy9memhlbmdo +dQohLS0uZmxpY2tyLmNvbS9waG90b3MvbG9uZWx5Zm94CiEtLWZsaWNrci5jb20v +cGhvdG9zL3ZhbnZhbi81Mjk5MjUxNTcKIS0tLmZsaWNrci5jb20vcGhvdG9zL3dp +bnRlcmthbmFsCiEtLS5mbGlja3IuY29tL3Bob3Rvcy96b2xhCnx8ZmxpY2tyLmNv +bQp8fHN0YXRpY2ZsaWNrci5jb20KCmZsaWNrcmhpdmVtaW5kLm5ldAouZmxpY2ty +aXZlci5jb20KLmZsaW5nLmNvbQp8fGZsaXBrYXJ0LmNvbQp8fGZsb2cudHcKfGh0 +dHA6Ly9jbi5mbW5ub3cuY29tCmZvZmxkZnJhZGlvLm9yZwpibG9nLmZvb2xzbW91 +bnRhaW4uY29tCi5mb3J1bTRoay5jb20KZmFuZ29uZy5mb3J1bXMtZnJlZS5jb20K +cGlvbmVlci13b3JrZXIuZm9ydW1zLWZyZWUuY29tCiEtLWZvdXJzcXVhcmUuY29t +CiEtLXxodHRwOi8vNHNxLmNvbQp8aHR0cHM6Ly9zcyouNHNxaS5uZXQKdmlkZW8u +Zm94YnVzaW5lc3MuY29tCnxodHRwOi8vZm94Z2F5LmNvbQp8fGZyaW5nZW5ldHdv +cmsuY29tCnx8ZmxlY2hlaW50aGVwZWNoZS5mcgouZm9jaGsub3JnCnxodHRwOi8v +Zm9jaGsub3JnCnx8Zm9jdXN0YWl3YW4udHcKLmZvY3VzdnBuLmNvbQp8fGZvZmcu +b3JnCi5mb2ZnLWV1cm9wZS5uZXQKLmZvb29vby5jb20KfHxmb29vb28uY29tCmZv +b3R3aWJhbGwuY29tCi5mb3RpbGUubWUKfHxmb3VydGhpbnRlcm5hdGlvbmFsLm9y +Zwp8fGZveGRpZS51cwp8fGZveHN1Yi5jb20KZm94dGFuZy5jb20KLmZwbXQub3Jn +CnxodHRwOi8vZnBtdC5vcmcKLmZwbXQudHcKLmZwbXQtb3NlbC5vcmcKfHxmcG10 +bWV4aWNvLm9yZwpmcW9rLm9yZwp8fGZxcm91dGVyLmNvbQp8fGZyYW5rbGMuY29t +Ci5mcmVha3NoYXJlLmNvbQp8aHR0cDovL2ZyZWFrc2hhcmUuY29tCnx8ZnJlZTR1 +LmNvbS5hcgpmcmVlLWdhdGUub3JnCi5mcmVlLWhhZGEtbm93Lm9yZwpmcmVlLXBy +b3h5LmN6Ci5mcmVlLmZyL2Fkc2wKa2luZW94LmZyZWUuZnIKdGliZXRsaWJyZS5m +cmVlLmZyCnx8ZnJlZWFsaW0uY29tCndoaXRlYmVhci5mcmVlYmVhcmJsb2cub3Jn +Cnx8ZnJlZWJyb3dzZXIub3JnCi5mcmVlY2hhbC5jb20KLmZyZWVkb21jaGluYS5p +bmZvCnx8ZnJlZWRvbWNoaW5hLmluZm8KLmZyZWVkb21ob3VzZS5vcmcKfHxmcmVl +ZG9taG91c2Uub3JnCi5mcmVlZG9tc2hlcmFsZC5vcmcKfHxmcmVlZG9tc2hlcmFs +ZC5vcmcKLmZyZWVmcS5jb20KLmZyZWVmdWNrdmlkcy5jb20KLmZyZWVnYW8uY29t +Cnx8ZnJlZWdhby5jb20KZnJlZWlsaGFtdG9odGkub3JnCi5mcmVla3dvbnB5b25n +Lm9yZwp8fHNhdmVsaXV4aWFvYm8uY29tCi5mcmVlbG90dG8uY29tCnx8ZnJlZWxv +dHRvLmNvbQpmcmVlbWFuMi5jb20KLmZyZWVvcGVudnBuLmNvbQpmcmVlbW9yZW4u +Y29tCmZyZWVtb3JlbmV3cy5jb20KZnJlZW11c2Uub3JnL2FyY2hpdmVzLzc4OQpm +cmVlbmV0LWNoaW5hLm9yZwpmcmVlbmV3c2NuLmNvbQpjbi5mcmVlb25lcy5jb20K +LmZyZWVvei5vcmcvYmJzCnx8ZnJlZW96Lm9yZwp8fGZyZWVzc2gudXMKZnJlZTR1 +LmNvbS5hcgouZnJlZS1zc2guY29tCnx8ZnJlZS1zc2guY29tCi5mcmVlY2hpbmEu +bmV3cy8KfHxmcmVlY2hpbmFmb3J1bS5vcmcKLmZyZWVkb21jb2xsZWN0aW9uLm9y +Zy9pbnRlcnZpZXdzL3JlYml5YV9rYWRlZXIKLmZyZWVmb3J1bXMub3JnCnx8ZnJl +ZW5ldHByb2plY3Qub3JnCi5mcmVlb3oub3JnCi5mcmVldGliZXQubmV0Cnx8ZnJl +ZXRpYmV0Lm9yZwouZnJlZXRpYmV0YW5oZXJvZXMub3JnCnxodHRwOi8vZnJlZXRp +YmV0YW5oZXJvZXMub3JnCi5mcmVldmlld21vdmllcy5jb20KLmZyZWV2cG4ubWUK +fGh0dHA6Ly9mcmVldnBuLm1lCnx8ZnJlZXdhbGxwYXBlcjQubWUKLmZyZWV3ZWJz +LmNvbQouZnJlZXdlY2hhdC5jb20KfHxmcmVld2VjaGF0LmNvbQpmcmVld2VpYm8u +Y29tCnx8ZnJlZXdlaWJvLmNvbQouZnJlZXhpbndlbi5jb20KLmZyZWV5b3V0dWJl +cHJveHkubmV0Cnx8ZnJlZXlvdXR1YmVwcm94eS5uZXQKZnJpZW5kZmVlZC5jb20K +ZnJpZW5kZmVlZC1tZWRpYS5jb20vZTk5YTRlYmUyZmI0YzE5ODVjMmE1ODc3NWVi +NDQyMjk2MWFhNWEyZQpmcmllbmRzLW9mLXRpYmV0Lm9yZwouZnJpZW5kc29mdGli +ZXQub3JnCmZyZWVjaGluYS5uZXQKfGh0dHA6Ly93d3cuemVuc3VyLmZyZWVyay5j +b20vCmZyZWV2cG4ubmwKZnJlZXllbGxvdy5jb20KaGsuZnJpZW5kZHkuY29tL2hr +CnxodHRwOi8vYWR1bHQuZnJpZW5kZmluZGVyLmNvbS8KLmZyaW5nLmNvbQp8fGZy +aW5nLmNvbQouZnJvbWNoaW5hdG91c2EubmV0Cnx8ZnJvbW1lbC5uZXQKLmZyb250 +bGluZWRlZmVuZGVycy5vcmcKLmZyb290dnBuLmNvbQp8fGZyb290dnBuLmNvbQp8 +fGZzY2tlZC5vcmcKLmZzdXJmLmNvbQoKISEtLS1GVENoaW5lc2UtLS0KfGh0dHBz +Oi8vd3d3LmZ0Y2hpbmVzZS5jb20KLmZ0Y2hpbmVzZS5jb20vY2hhbm5lbC92aWRl +bwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMjc1MwouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwMjY2MTYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDI2NzQ5Ci5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTAyNjgwNwouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwMjY4MDgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDI2ODM0Ci5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTAyNjg4MAouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwMjc0MjkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDMwMzQxCi5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTAzMDUwMgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +MzA4MDMKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDMxMzE3Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTAzMjYxNwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzI2 +MzYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDMyNjkyCi5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTAzMjc2MgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzMxMzgK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM0OTE3Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTAzNDkyNgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzQ5MjcKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM0OTI4Ci5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTAzNDk1MgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzU4OTAKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDM1OTcyCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTAzNTk5MwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzY0MTcKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDM3MDkwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAz +NzA5MQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzgxNzgKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDM4MTk5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzODIy +MAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzg4MTkKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDM4ODYyCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzOTA2Nwou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzkxNzgKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDM5MjExCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzOTI3MQouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwMzkyOTUKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDM5MzY5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzOTQ4MgouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwMzk1MzQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDM5NTU1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzOTU3NgouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwMzk3MTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM5 +Nzc5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzOTgwOQouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNDAxMzQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQwODM1 +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MDg5MAouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNDA5MTgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQwOTkyCi5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MTIwOQouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNDIxMDAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQyMjUyCi5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA0MjI3MgouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNDIyODAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQzMDI5Ci5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA0MzA2NgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NDMwOTYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQzMTI0Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA0MzE1MgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDMx +ODkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQzNDI4Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA0MzQzOQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDM1MzQK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQzNjc1Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA0MzY4MAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDM3MDIKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQzODQ5Ci5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA0NDA5OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDQ3NzYKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDQ0ODcxCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA0NDg5NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDUxMTQKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDQ1MTM5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0 +NTE4NgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDU3NTUKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDQ2MDg3Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NjEw +NQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDYxMTgKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDQ2MTMyCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NjUxNwou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDY4MjIKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDQ2ODY2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0Njk0MgouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNDcxODAKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDQ3MjA2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NzMwNAouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNDczMTcKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDQ3MzQ1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NzM1OAouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNDczNzUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ3 +MzgxCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NzQxMwouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNDc0NTYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ3NDkx +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NzU0NQouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNDc1NTgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ3NTY4Ci5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NzYyNwouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNDgyOTMKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ4MzQzCi5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA0ODcxMAouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNDkyODkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ5MzYwCi5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA0OTg5NgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NTAxNTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUxMDI3Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA1MTE2MQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTEz +NzIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUxNDc5Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA1MjEzOAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTIxNjEK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUyNTI1Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA1MjU0OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTI3MDEKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUyOTY1Ci5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA1MzE0OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTMxNTAKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDUzMjAwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA1MzQyNQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTM0OTYKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDUzNTI2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1 +MzkwNgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQwNDkKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDU0MTAzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NDEw +OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQxMTkKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDU0MTIzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NDEzOQou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQxNjYKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDU0MTY4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NDE5MAouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNTQ0MzcKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDU0NTI2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NDYwNwouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNTQ2NDQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDU0Nzg2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NDg0MwouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNTQ5MjUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU0 +OTQwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NTA1MQouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNTUwNjMKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU1MDY5 +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NTEzNgouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNTUxNzAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU1MjAyCi5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NTI0MgouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNTUyNjMKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU1Mjc0Ci5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA1NTI5OQouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNTU0ODAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU1NTUxCi5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA1NTU1OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NTU1NjYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2MDk5Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA1NjEwOAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTYx +MzEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2Mzc1Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA1NjQ5MQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY1MjkK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2NTM0Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA1NjUzOAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY1NDEKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2NTU0Ci5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA1NjU1NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY1NjAKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDU2NTY3Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA1NjU3NAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY1ODgKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDU2NTk0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1 +NjU5NgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY2ODQKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDU2ODMyCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1Njgz +MwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY4NTEKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDU2ODc0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1Njg5Ngou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY5MjcKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDU3MDExCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NzAxOAouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNTcwNDQKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDU3MTYyCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NzUwMAouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNTc1MDQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDU3NTA5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NzUxOAouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNTc1MzIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU3 +NTMzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NzU1NgouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNTc1ODAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU3NjM4 +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NzY0NAouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNTc4MTcKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU3ODc1Ci5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODAwOQouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNTgwNTYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4MjI0Ci5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA1ODI1NwouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNTgyOTUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4MzI4Ci5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA1ODMzOQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NTgzNDQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4MzUyCi5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA1ODQxMwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg0 +MjEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4NDQwCi5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA1ODQ1OAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg0NjgK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4NTYxCi5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA1ODU2NgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg1NjcKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4NTg1Ci5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA1ODYyOAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg2NTYKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDU4NjY1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA1ODY3OAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg2OTEKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDU4NzIxCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1 +ODcyOAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTk0NjQKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDU5NDg0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1OTUz +NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTk1MzgKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDU5NTUxCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1OTgxOAou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTk5MTQKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDU5OTIwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1OTk1NwouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNjAwODgKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDYwMTU2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MDE1NwouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNjAxNjAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDYwMTgxCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MDE4NQouZnRjaGluZXNl LmNvbS9zdG9yeS8wMDEwNjA0OTMKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYw -NDk1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MDkyMQouZnRjaGluZXNlLmNv -bS9zdG9yeS8wMDEwNjExMjAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyMDI4 -Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MjE3NgouZnRjaGluZXNlLmNvbS9z -dG9yeS8wMDEwNjI0ODIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyNTA4Ci5m -dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2Mjc0MQouZnRjaGluZXNlLmNvbS9zdG9y -eS8wMDEwNjI3OTQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYzMTYwCi5mdGNo -aW5lc2UuY29tL3N0b3J5LzAwMTA2MzY5MgouZnRjaGluZXNlLmNvbS9zdG9yeS8w -MDEwNjUyODcKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY2NDY1Ci5mdGNoaW5l -c2UuY29tL3N0b3J5LzAwMTA2Njk1OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw -Njc0MzUKd3d3LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY3NDc5Ci5mdGNoaW5l -c2UuY29tL3N0b3J5LzAwMTA2NzU0NQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw -Njc2NDgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY3NjUwCi5mdGNoaW5lc2Uu -Y29tL3N0b3J5LzAwMTA2ODI0OAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjgy -NzgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY4Mzc5Ci5mdGNoaW5lc2UuY29t -L3N0b3J5LzAwMTA2ODQ4MwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjkzNzMK -LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY5NTE2Ci5mdGNoaW5lc2UuY29tL3Zp -ZGVvLzE0MzcKLmZ0Y2hpbmVzZS5jb20vY29tbWVudHMKZnVjZC5jb20KLmZ1Y2tj -bm5pYy5uZXQKfHxmdWNrY25uaWMubmV0CmZ1Y2tnZncub3JnCnx8ZnVsbGVyY29u -c2lkZXJhdGlvbi5jb20KZnVsdWUuY29tCi5mdW5mLnR3CmZ1bnAuY29tCi5mdXEu -Y29tCi5mdXJoaGRsLm9yZwp8fGZ1cmlua2FuLmNvbQouZnV0dXJlY2hpbmFmb3J1 -bS5vcmcKfHxmdXR1cmVtZXNzYWdlLm9yZwouZnV4LmNvbQouZnV5aW4ubmV0Ci5m -dXlpbmRpYW50YWkub3JnCi5mdXl1Lm9yZy50dwp8fGZ3LmNtCmZ6aDk5OS5jb20K -ZnpoOTk5Lm5ldApmemxtLmNvbQoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tR0ctLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi5nNmhlbnRhaS5jb20KfGh0dHA6Ly9nNmhl -bnRhaS5jb20KfHxnLXF1ZWVuLmNvbQp8fGdhYm9jb3JwLmNvbQouZ2FlcHJveHku -Y29tCi5nYWZvcnVtLm9yZwouZ2FsYXh5bWFjYXUuY29tCnx8Z2FsZW53dS5jb20K -LmdhbHN0YXJzLm5ldAp8fGdhbWU3MzUuY29tCmdhbWViYXNlLmNvbS50dwpnYW1l -am9sdC5jb20KfGh0dHA6Ly93aWtpLmdhbWVycC5qcAp8fGdhbWVyLmNvbS50dwou -Z2FtZXIuY29tLnR3Ci5nYW1lei5jb20udHcKfHxnYW1lei5jb20udHcKLmdhbW91 -c2EuY29tCi5nYW9taW5nLm5ldAp8fGdhb21pbmcubmV0Cmdhbmdlcy5jb20KLmdh -b3BpLm5ldAp8aHR0cDovL2dhb3BpLm5ldAouZ2Fvemhpc2hlbmcub3JnCi5nYW96 -aGlzaGVuZy5uZXQKZ2FyZGVubmV0d29ya3MuY29tCnx8Z2FyZGVubmV0d29ya3Mu -b3JnCiEtLUlQIG9mIEdhcmRlbiBOZXR3b3JrCjcyLjUyLjgxLjIyCnx8Z2FydGxp -dmUuY29tCnx8Z2F0aGVyLmNvbQpnYXRpLm9yZy50dwouZ2F5YnViYmxlLmNvbQou -Z2F5Y24ubmV0Cnx8Z2F5bWFwLmNjCi5nYXl0dWJlLmNvbQouZ2F6b3R1YmUuY29t -Cnx8Z2F6b3R1YmUuY29tCnx8Z2NjLm9yZy5oawp8fGdjbG9vbmV5LmNvbQouZ2Nw -bmV3cy5jb20KfGh0dHA6Ly9nY3BuZXdzLmNvbQouZ2RidC5uZXQvZm9ydW0KZ2R6 -Zi5vcmcKfHxnZWVrLWFydC5uZXQKZ2Vla2VyaG9tZS5jb20vMjAxMC8wMy94aXhp -YW5nLXByb2plY3QtY3Jvc3MtZ2Z3Cnx8Z2Vla2hlYXJ0LmluZm8KfHxnZWVrbWFu -dWFscy5jb20KLmdlbGJvb3J1LmNvbQp8aHR0cDovL2dlbGJvb3J1LmNvbQohLS18 -fGdlbnVpdGVjLmNvbQouZ2VvY2l0aWVzLmNvLmpwCi5nZW9jaXRpZXMuY29tL1Np -bGljb25WYWxsZXkvQ2lyY3VpdC81NjgzL2Rvd25sb2FkLmh0bWwKaGsuZ2VvY2l0 -aWVzLmNvbQpnZW9jaXRpZXMuanAKfHxnZW9ob3QuY29tCnx8Z2VvbWV0cmljdG9v -bHMuY29tCi5nZXJlZm91bmRhdGlvbi5vcmcKLmdldGNodS5jb20KLmdldGNsb2Fr -LmNvbQp8fGdldGNsb2FrLmNvbQp8fGdldGZveHlwcm94eS5vcmcKLmdldGZyZWVk -dXIuY29tCnx8Z2V0Z29tLmNvbQouZ2V0bGFudGVybi5vcmcKfHxnZXRsYW50ZXJu -Lm9yZwouZ2V0amV0c28uY29tL2ZvcnVtCmdldGl0b24uY29tCi5nZXRzb2NpYWxz -Y29wZS5jb20KZ2Zidi5kZQouZ2Znb2xkLmNvbS5oawouZ2ZzYWxlLmNvbQp8fGdm -c2FsZS5jb20KZ2Z3Lm9yZy51YQouZ2Z3LnByZXNzCnxodHRwOi8vZ2Z3LnByZXNz -Ci5nZ3NzbC5jb20KfHxnZ3NzbC5jb20KfHxnaG9zdC5vcmcKLmdob3N0cGF0aC5j -b20KfHxnaG9zdHBhdGguY29tCnx8Z2h1dC5vcmcKfHxnaWdhLXdlYi5qcAp8dHcu -Z2lnYWNpcmNsZS5jb20KfGh0dHA6Ly9jbi5naWdhbmV3cy5jb20vCmdpZ3Bvcm5v -LnJ1Cnx8Z2lybGJhbmtlci5jb20KLmdpdC5pbwp8fGdpdC5pbwp8aHR0cDovL3Nv -ZnR3YXJlZG93bmxvYWQuZ2l0Ym9va3MuaW8KCiEtLS1HaXRIdWItLS0KLmdpdGh1 -Yi5jb20KfGh0dHBzOi8vZ2lzdC5naXRodWIuY29tCmh0dHA6Ly9jdGhsby5naXRo -dWIuaW8vaGt0dgohLS18aHR0cDovL29uaW9uaGFja2VyLmdpdGh1Yi5pbwp3c2d6 -YW8uZ2l0aHViLmlvCnx8d3NnemFvLmdpdGh1Yi5pbwohLS0uZ2l0aHViLmlvCgou -Z2l6bGVuLm5ldAp8fGdpemxlbi5uZXQKLmdqY3p6LmNvbQp8fGdsZW5uaGlsdG9u -LmNvbQpnbG9iYWxqaWhhZC5uZXQKZ2xvYmFsbWVkaWFvdXRyZWFjaC5jb20KZ2xv -YmFsbXVzZXVtb25jb21tdW5pc20ub3JnCnx8Z2xvYmFscmVzY3VlLm5ldAouZ2xv -YmFsdG0ub3JnCi5nbG9iYWx2b2ljZXNvbmxpbmUub3JnCnx8Z2xvYmFsdm9pY2Vz -b25saW5lLm9yZwouZ2xvY2suY29tCmdsdWNrbWFuLmNvbS9EYWxhaUxhbWEKZ21i -ZC5jbgp8fGdtaHoub3JnCnxodHRwOi8vd3d3LmdtaWRkbGUuY29tCnxodHRwOi8v -d3d3LmdtaWRkbGUubmV0Ci5nbWxsLm9yZwp8fGduY2kub3JnLmhrCmdvLXBraS5j -b20KfHxnb2FnZW50LmJpegp8fGdvYWdlbnRwbHVzLmNvbQpnb2JldC5jYwpnb2Rm -b290c3RlcHMub3JnCnx8Z29kZm9vdHN0ZXBzLm9yZwpnb2Rucy53b3JrCmdvZHNk -aXJlY3Rjb250YWN0LmNvLnVrCi5nb2RzZGlyZWN0Y29udGFjdC5vcmcKZ29kc2Rp -cmVjdGNvbnRhY3Qub3JnLnR3Ci5nb2RzaW1tZWRpYXRlY29udGFjdC5jb20KLmdv -Z290dW5uZWwuY29tCnx8Z29oYXBweS5jb20udHcKLmdva2JheXJhay5jb20KLmdv -bGRiZXQuY29tCnx8Z29sZGJldHNwb3J0cy5jb20KLmdvbGRlbmZyb2cuY29tCnx8 -Z29sZGVuZnJvZy5jb20KLmdvbGRzdGVwLm5ldAp8fGdvbGR3YXZlLmNvbQpnb25n -bWVuZy5pbmZvCmdvbmdtLmluCmdvbmdtaW5saWxpYW5nLmNvbQouZ29uZ3d0LmNv -bQp8aHR0cDovL2dvbmd3dC5jb20KYmxvZy5nb28ubmUuanAvZHVjay10YWlsXzIw -MDkKLmdvb2RheS54eXoKfGh0dHA6Ly9nb29kYXkueHl6Ci5nb29kcmVhZHMuY29t -Cnx8Z29vZHJlYWRzLmNvbQouZ29vZHJlYWRlcnMuY29tCnx8Z29vZHJlYWRlcnMu -Y29tCi5nb29kdHYuY29tLnR3Ci5nb29kdHYudHYKfHxnb29maW5kLmNvbQouZ29v -Z2xlc2lsZS5jb20KLmdvcGV0aXRpb24uY29tCnx8Z29wZXRpdGlvbi5jb20KLmdv -cHJveGluZy5uZXQKLmdvdHJ1c3RlZC5jb20KfHxnb3RydXN0ZWQuY29tCnx8Z290 -dy5jYQp8fGdyYW1tYWx5LmNvbQpncmFuZHRyaWFsLm9yZwouZ3JhcGhpcy5uZS5q -cAp8fGdyYXBoaXMubmUuanAKIS0tfHxzLmdyYXZhdGFyLmNvbQpncmVhdGZpcmV3 -YWxsLmJpegp8fGdyZWF0ZmlyZXdhbGxvZmNoaW5hLm5ldAouZ3JlYXRmaXJld2Fs -bG9mY2hpbmEub3JnCnx8Z3JlYXRmaXJld2FsbG9mY2hpbmEub3JnCnx8Z3JlZW5m -aWVsZGJvb2tzdG9yZS5jb20uaGsKLmdyZWVucGFydHkub3JnLnR3Cnx8Z3JlZW5w -ZWFjZS5vcmcKLmdyZWVucmVhZGluZ3MuY29tL2ZvcnVtCmdyZWF0LWZpcmV3YWxs -LmNvbQpncmVhdC1yb2Mub3JnCmdyZWF0cm9jLm9yZwpncmVhdHpob25naHVhLm9y -ZwouZ3JlZW5wZWFjZS5jb20udHcKLmdyZWVudnBuLm5ldAp8fGdyZWVudnBuLm5l -dAouZ3JlZW52cG4ub3JnCmdzLWRpc2N1c3MuY29tCnx8Z3RyaWNrcy5jb20KZ3Vh -bmNoYS5vcmcKLmd1YXJkc3Rlci5jb20KLmd1bi13b3JsZC5uZXQKZ3Vuc2FuZGFt -bW8uY29tCnx8Z3V0dGVydW5jZW5zb3JlZC5jb20KfHxndm0uY29tLnR3Ci5nem0u -dHYKfHxnem9uZS1hbmltZS5pbmZvCgohLS0tLS0tLS0tLS0tLUdIUy0tLS0tCiEt -fHxmZWVkcy5jYnNuZXdzLmNvbQohLXx8d3d3LmNoaW5lc2VhbGJ1bWFydC5jb20K -fHxjbGVtZW50aW5lLXBsYXllci5vcmcKIS18fGNsZW1lc2hhLm9yZwohLXx8d3d3 -LmNsb3VkZ2lybGZyaWVuZC5jb20KIS18fGNvY29hd2l0aGxvdmUuY29tCiEtfHxi -bG9nLmNvbnRyb2xzcGFjZS5vcmcKIS1ECiEtfHx3d3cuZGFpbHlneWFuLmNvbQoh -LXx8ZGFpbHl0b2RvLm9yZwohLXx8YmxvZy5kYW5tYXJuZXIuY29tCiEtfHxnaXRo -dWIuZGFubWFybmVyLmNvbQohLXx8ZGVzaWduLXNlZWRzLmNvbQohLXx8ZGVzaWdu -ZXJzLWFydGlzdHMuY29tCiEtfHxtYWlsLmRpeWFuZy5vcmcKIS18fGJsb2cuZG91 -Z2hlbGxtYW5uLmNvbQohLXx8ZG93bmZvcmV2ZXJ5b25lb3JqdXN0bWUuY29tCiEt -fHxkcm9pZHNlY3VyaXR5LmNvbQohLXx8d3d3LmRyb3Btb2Nrcy5jb20KIS18fGR1 -bWJsaXR0bGVtYW4uY29tCiEtRQplY2hvZm9uLmNvbQohLXx8ZWNob2Zvbi5jb20K -IS18fGVwYy1qYXYuY29tCiEtfHxldmVyZGFyay5pbmZvCiEtfHxldmhlYWQuY29t -CiEtRgohLXx8ZmFjaWxlbG9naW4uY29tCiEtfHwqLmZhdGR1Y2sub3JnCiEtfHxi -bG9nLmZkY24ub3JnCiEtfHxmZnRvZ28uY29tCiEtfHxmbGlnaHRzaW10YWxrLmNv -bQohLXx8bWNsZWUuZm9vbG1lLm5ldAohLXx8d3d3LmZyaWVuZGRlY2suY29tCiEt -fHxmcmluZ2VzcG9pbGVycy5jb20KIS18fGZyaW5nZXRlbGV2aXNpb24uY29tCiEt -fHxmdW5wZWEuY29tCiEtRwohLXx8YmxvZy5nYXRlaW4ub3JnCiEtfHxmZWVkcy5n -YXdrZXIuY29tCiEtfHxnZWVrdGFuZy5jb20KIS18fGdlb2hvdC51cwohLXx8Z2V0 -YXJvdW5kLmNvbQohLXx8Z21lci5uZXQKIS18fHd3dy5nbW90ZS5vcmcKIS18fGJs -b2cuZ28yd2ViMjAubmV0CiEtfHxnb29nbGUtbWVsYW5nZS5jb20KIS18fGZhbWUu -Z29uem9sYWJzLm9yZwohLXx8Z292ZWNuLm9yZwohLXx8Z3F1ZXVlcy5jb20KIS18 -fGdyYXBoeWNhbGMuY29tCnx8Z3JlYXNlc3BvdC5uZXQKIS18fGJsb2cuZ3Jvd2xm -b3J3aW5kb3dzLmNvbQohLUgKIS18fGhjbS5jb20udHcKIS18fGJsb2cuaGVhZGl1 -cy5jb20KIS18fGhvZ2JheXNvZnR3YXJlLmNvbQohLXx8YmxvZy5ob3RvdC5vcmcK -IS18fGZlZWRzLmhvd3N0dWZmd29ya3MuY29tCiEtfHxodWhhaXRhaS5jb20KIS18 -fGJsb2cuaHVtYW5yaWdodHNmaXJzdC5vcmcKIS1JCiEtfHxzaXRlLmljdS1wcm9q -ZWN0Lm9yZwohLXx8aWdvcndhcmUuY29tCiEtfHxpaGFzMTMzN2NvZGUuY29tCiEt -fHxpbmtub3V2ZWF1LmNvbQohLXx8aW5vdGUudHcKIS18fGlyb25oZWxtZXQuY29t -CiEtfHxpd2Z3Y2YuY29tCiEtSgohLXx8YmxvZy5qYW5nbXQuY29tCiEtfHxibG9n -LmpheWZpZWxkcy5jb20KIS18fHQuamllY2lpLmNvbQohLXx8YmxvZy5qb2ludC5u -ZXQKIS18fGJsb2cuanNxdWFyZWRqYXZhc2NyaXB0LmNvbQohLXx8YmxvZy5qdGJ3 -b3JsZC5jb20KIS1LCiEtfHxrYXRoeXNjaHdhbGJlLmNvbQohLXx8dG9tYXRvdnBu -LmtlaXRobW95ZXIuY29tCiEtfHx3d3cua2VpdGhtb3llci5jb20KIS18fGtlbmRh -bHZhbmR5a2UuY29tCiEtfHxibG9nLmtlbmdhby50dwohLXx8bG9nLmtlc28uY24K -IS18fHd3dy5raGFuYWNhZGVteS5vcmcKfHx3d3cua2xpcC5tZQohLXx8dXNibG9h -ZGVyZ3gua291cmVpby5uZXQKIS18fGJsb2cua293YWxjenlrLmluZm8KIS1MCiEt -fHxsYWJ5cmludGgyLmNvbQohLXx8bGFyc2dlb3JnZS5jb20KIS18fGJsb2cubGFz -dHBhc3MuY29tCiEtfHxkb2NzLmxhdGV4bGFiLm9yZwohLXx8bGVhbmVzc2F5cy5j -b20KIS18fGJsb2cubGlkYW9iaW5nLmluZm8KIS18fGxvZy5saWdodG9yeS5uZXQK -IS18fGZlZWRzLmxpbWkubmV0CiEtfHx3d3cubGl0ZWFwcGxpY2F0aW9ucy5jb20K -IS18fGJsb2cubGl1a2FuZ3h1LmluZm8KIS18fHR3aXR0ZXIubGl1a2FuZ3h1Lmlu -Zm8KIS18fG9hc2lzbmV3c3Jvb20ubGl2ZTRldmVyLnVzCiEtfHx3d3cubG9ja2Vy -Z25vbWUuY29tCiEtfHxsb2NxbC5jb20KQEB8fHNpdGUubG9jcWwuY29tCiEtfHxm -ZWVkcy5sb2ljbGVtZXVyLmNvbQohLXx8YmxvZy5sb3Vpc2dyYXkuY29tCiEtTQoh -LXx8bWFkZWJ5c29mYS5jb20KIS18fG1hZGVtb2lzZWxsZXJvYm90LmNvbQohLXx8 -bWFzYW1peGVzLmNvbQohLXx8d3d3Lm1ldGFtdXNlLm5ldAohLXx8YmxvZy5tZXRh -c3Bsb2l0LmNvbQohLXx8bWlsYXppLmNvbQohLXx8d3d3Lm1pbml3ZWF0aGVyLmNv -bQohLXx8dHdpdHRlci5taXNzaXUuY29tCiEtfHxwbHVya3RvcC1idXR0b24ubW1k -YXlzLmNvbQohLXx8ZmVlZHMubW9iaWxlcmVhZC5jb20KIS18fHd3dy5tb2Rlcm5p -enIuY29tCiEtfHx3d3cubW9kay5pdAohLXx8bXl0d2lzaGlydC5jb20KIS1OCiEt -fHxibG9nLm5ldGZsaXguY29tCiEtfHxibG9nLm5paGlsb2dpYy5kawohLXx8bnRs -ay5vcmcKIS18fG52cXVhbi5vcmcKIS18fG5vZ29vZGF0Y29kaW5nLmNvbQohLXx8 -YmxvZy5ub3Rkb3QubmV0CiEtfHx3d3cubm90aWZ5LmlvCiEtTwohLXx8YmxvZy5v -YnZpb3VzLmNvbQohLXx8b25lYmlnZmx1a2UuY29tCiEtfHxvdmVyc3RpbXVsYXRl -LmNvbQohLVAKIS18fHBjZ2Vla2Jsb2cuY29tCiEtfHxmZWVkcy5wZGZjaG0ubmV0 -CiEtfHxmZWVkcy5wZW9wbGUuY29tCiEtfHxibG9nLnBlcnNpc3RlbnQuaW5mbwoh -LXx8Y2hyb21lLnBsYW50c3Zzem9tYmllcy5jb20KIS18fHBvcnRhYmxlc29mdC5v -cmcucnUKIS18fHByYXNhbm5hdGVjaC5uZXQKIS18fHRhbGsubmV3cy5wdHMub3Jn -LnR3CiEtfHxweXRob24tZXhjZWwub3JnCiEtUQohLVIKIS18fHItY2hhcnQuY29t -CiEtfHxyYW1lc2hzdWJyYW1hbmlhbi5vcmcKIS18fHJhcGlkLnBrCiEtfHxibG9n -LnJlZGRpdC5jb20KIS18fGJsb2cucmVuYW5zZS5jb20KIS18fHJvYmVydG1hby5j -b20KIS18fHd3dy5yb21lby1mb3h0cm90LmNvbQohLVMKIS18fHNhbG1peXVjay5j -b20KIS18fHNhbXNhbC5jb20KIS18fGJsb2cuc2VlbWluZ2xlZS5jb20KIS18fGJs -b2cuc2Zsb3cuY29tCiEtfHxibG9nLnNpZ2ZwZS5jb20KIS18fHNpbXBsZXRleHQu -d3MKIS18fHd3dy5za3VscHQub3JnCiEtfHxyc3Muc2xhc2hkb3Qub3JnCiEtfHxz -bmlwcGV0c2FwcC5jb20KIS18fHcuc25zLmx5CiEtfHx3d3cuc29jaWFsbm1vYmls -ZS5jb20KIS18fHd3dy5zb2NpYWx3aG9pcy5jb20KIS18fHNwaXJpdGpiLm9yZwoh -LXx8c3Nib29rLmNvbQohLXx8c3NoZm9yd2FyZGluZy5jb20KIS18fHN0YXRpb25l -cmlhLmNvbQp8fHN0ZXBoYW5pZXJlZC5jb20KIS18fHN1bmppZG9uZy5uZXQKIS18 -fHN5bml1bXNvZnR3YXJlLmNvbQpAQHx8ZG93bmxvYWQuc3luaXVtc29mdHdhcmUu -Y29tCiEtVAohLXx8dGFneGVkby5jb20KIS18fGJsb2cudGF0b2ViYS5vcmcKIS18 -fHd3dy50ZWNoZm9iLmNvbQohLXx8dGVhY2hwYXJlbnRzdGVjaC5vcmcKIS18fHRo -ZThwZW4uY29tCiEtfHx0aGVpcGhvbmV3aWtpLmNvbQohLXx8YmxvZy50aGVzaWxl -bnRudW1iZXIubWUKIS18fHRoZXNwb250eS5jb20KIS18fHRoZXVsdHJhbGlueC5j -b20KIS18fGJsb2cudGhpbmstYXN5bmMuY29tCiEtfHx0b3JuYWRvd2ViLm9yZwoh -LXx8dHJhbnNwYXJlbnR1cHRpbWUuY29tCiEtfHx0cmlhbmd1bGF0aW9uYmxvZy5j -b20KIS18fGJsb2cudHN1bmFuZXQubmV0CiEtfHxlbi50dXhlcm8uY29tCiEtfHx0 -d2F6enVwLmNvbQohLXx8dHdlZXRzd2VsbC5jb20KIS18fHR3aWJlcy5jb20KIS18 -fGFydC50d2dnLm9yZwohLXx8dHdpdmVydC5jb20KIS1VCnxodHRwOi8vdWIwLmNj -CiEtfHxqb25ueS51YnVudHUtdHcubmV0CiEtfHxibG9nLnVtb25rZXkubmV0CiEt -VgohLXx8dHAudmJhcC5jb20uYXUKIS18fHd3dy52aXJ0dW91c3JvbS5jb20KIS18 -fGJsb2cudmlzaWJvdGVjaC5jb20KIS1XCiEtfHx3YXZlcHJvdG9jb2wub3JnCiEt -fHx3d3cud2F2ZXNhbmRib3guY29tCiEtfHx3ZWJmZWUub3JnLnJ1CiEtfHxibG9n -LndlYm1wcm9qZWN0Lm9yZwohLXx8d2VidXBkOC5vcmcKIS18fHd3dy53aGF0YnJv -d3Nlci5vcmcKIS18fHd3dy53aGVyZWRveW91Z28ubmV0CiEtfHx3aWxsaGFpbnMu -Y29tCiEtfHxmZWVkcy53aXJlZC5jb20KIS18fHdpc2VtYXBwaW5nLm9yZwp3b3p5 -LmluCiEtfHx3b3p5LmluLwohLXx8YmxvZy53dW5kZXJjb3VudGVyLmNvbQohLVgK -IS18fHhkZWx0YS5vcmcKIS18fHhpYW9nYW96aS5vcmcKIS18fHhpbG91LnVzCiEt -fHx4enkub3JnLnJ1CiEtWQohLXx8eW9vcGVyLmJlCiEtfHx0c29uZy55dW54aS5u -ZXQKIS1aCgpnb3NwZWxoZXJhbGQuY29tCnx8Z29zcGVsaGVyYWxkLmNvbQp8aHR0 -cDovL2hrLmdyYWRjb25uZWN0aW9uLmNvbS8KfHxncmFuZ29yei5vcmcKfHxncmF5 -bG9nMi5vcmcKZ3JlYXRmaXJlLm9yZwp8fGdyZWF0ZmlyZS5vcmcKZ3JlYXRmaXJl -d2FsbG9mY2hpbmEub3JnCnx8Z3JlYXRyb2MudHcKfHxnc3RhdGljLmNvbQouZ3Ut -Y2h1LXN1bS5vcmcKfGh0dHA6Ly9ndS1jaHUtc3VtLm9yZwpndWlzaGFuLm9yZwp8 -fGd1aXNoYW4ub3JnCnx8Z3Vuc2FtZXJpY2EuY29tCmd1cnVvbmxpbmUuaGsKfGh0 -dHA6Ly9ndmxpYi5jb20KLmd5YWx3YXJpbnBvY2hlLmNvbQouZ3lhdHNvc3R1ZGlv -LmNvbQoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tSEgtLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tCi5oNTI4LmNvbQouaDVkbS5jb20KLmg1Z2FsZ2FtZS5tZQp8fGgtY2hp -bmEub3JnCi5oLW1vZS5jb20KfGh0dHA6Ly9oLW1vZS5jb20KaDFuMWNoaW5hLm9y -ZwouaGFjZy5jbHViCnx8aGFjZy5jbHViCi5oYWNnLmluCnxodHRwOi8vaGFjZy5p -bgouaGFjZy5saQp8aHR0cDovL2hhY2cubGkKLmhhY2cucmVkCnxodHRwOi8vaGFj -Zy5yZWQKLmhhY2tlbi5jYy9iYnMKfHxoYWNrdGhhdHBob25lLm5ldApoYWhsby5j -b20KfHxoYWtrYXR2Lm9yZy50dwouaGFuZGNyYWZ0ZWRzb2Z0d2FyZS5vcmcKfGh0 -dHA6Ly9iYnMuaGFubWluenUub3JnLwouaGFudW55aS5jb20KfGh0dHA6Ly9hZS5o -YW8xMjMuY29tCnxodHRwOi8vYXIuaGFvMTIzLmNvbQp8aHR0cDovL2JyLmhhbzEy -My5jb20KfGh0dHA6Ly9lbi5oYW8xMjMuY29tCnxodHRwOi8vaWQuaGFvMTIzLmNv -bQp8aHR0cDovL2pwLmhhbzEyMy5jb20KfGh0dHA6Ly9tYS5oYW8xMjMuY29tCnxo -dHRwOi8vbXguaGFvMTIzLmNvbQp8aHR0cDovL3NhLmhhbzEyMy5jb20KfGh0dHA6 -Ly90aC5oYW8xMjMuY29tCnxodHRwOi8vdHcuaGFvMTIzLmNvbQp8aHR0cDovL3Zu -LmhhbzEyMy5jb20KfGh0dHA6Ly9oay5oYW8xMjNpbWcuY29tCnxodHRwOi8vbGQu -aGFvMTIzaW1nLmNvbQp8fGhhcHB5LXZwbi5jb20KfHxoYXJkc2V4dHViZS5jb20K -LmhhcnVueWFoeWEuY29tCnxodHRwOi8vaGFydW55YWh5YS5jb20KfHxoYXNhb3dh -bGwuY29tCmJicy5oYXNpLndhbmcKaGF2ZTguY29tCkBAfHxoYXlnby5jb20KfHxo -ZHR2Yi5uZXQKLmhkem9nLmNvbQp8aHR0cDovL2hkem9nLmNvbQp8fGhlYXJ0eWl0 -LmNvbQouaGVjLnN1CnxodHRwOi8vaGVjLnN1Ci5oZWNhaXRvdS5uZXQKfHxoZWNh -aXRvdS5uZXQKLmhlY2hhamkuY29tCnx8aGVjaGFqaS5jb20KfHxoZWVhY3QuZWR1 -LnR3Ci5oZWdyZS1hcnQuY29tCnxodHRwOi8vaGVncmUtYXJ0LmNvbQp8fGNkbi5o -ZWxpeHN0dWRpb3MubmV0Cnx8aGVscGxpbmZlbi5jb20KfHxoZWxsb2FuZHJvaWQu -Y29tCnx8aGVsbG9xdWVlci5jb20KaGVsbG90eHQuY29tCnx8aGVsbG90eHQuY29t -Ci5oZW50YWkudG8KLmhlbGxvdWsub3JnL2ZvcnVtL2xvZml2ZXJzaW9uCi5oZWxw -ZWFjaHBlb3BsZS5jb20KfHxoZWxwZWFjaHBlb3BsZS5jb20KfHxoZWxwc3Rlci5k -ZQouaGVscHpodWxpbmcub3JnCmhlbnRhaXR1YmUudHYKLmhlbnRhaXZpZGVvd29y -bGQuY29tCgohIyMjIyMjIyMjIyMtLUhlcm9rdS0tIyMjIyMjIyMjIwp8fGdldGNs -b3VkYXBwLmNvbQp8fGNsLmx5CkBAfHxmLmNsLmx5Cnx8Z2V0c21hcnRsaW5rcy5j -b20KfHxnaXQtc2NtLmNvbQoKaGVxaW5nbGlhbi5uZXQKfHxoZXVuZ2tvbmdkaXNj -dXNzLmNvbQohLS1Hb29nbGUgZW1wbG95ZWUgd2l0aGluIEdvb2dsZSBJUAp8fGhl -eHhlaC5uZXQKYXBwLmhleXdpcmUuY29tCi5oZXl6by5jb20KLmhnc2Vhdi5jb20K -LmhoZGNiM29mZmljZS5vcmcKaGktb24ub3JnLnR3CmhpZGRlbi1hZHZlbnQub3Jn -Cnx8aGlkZGVuLWFkdmVudC5vcmcKaGlkZWNsb3VkLmNvbS9ibG9nLzIwMDgvMDcv -MjkvZnVjay1iZWlqaW5nLW9seW1waWNzLmh0bWwKfHxoaWRlLm1lCi5oaWRlaXB2 -cG4uY29tCnx8aGlkZWlwdnBuLmNvbQouaGlkZW1hbi5uZXQKfHxoaWRlbWFuLm5l -dApoaWRlbWUubmwKLmhpZGVteWFzcy5jb20KfHxoaWRlbXlhc3MuY29tCmhpZGVt -eWNvbXAuY29tCnx8aGlkZW15Y29tcC5jb20KLmhpaGlmb3J1bS5jb20KfGh0dHA6 -Ly9oaWhpZm9ydW0uY29tCnx8aGloaXN0b3J5Lm5ldAouaGlnZncuY29tCmhpZ2hw -ZWFrc3B1cmVlYXJ0aC5jb20KfHxoaWdocm9ja21lZGlhLmNvbQp8fGhpaXRjaC5j -b20KfHxoaWtpbmdnZncub3JnCi5oaWxpdmUudHYKCi5oaW1hbGF5YW4tZm91bmRh +NDk1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MDU5MAouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNjA4NDYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYwODQ3 +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MDg3NQouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNjA5MjEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYwOTQ2Ci5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MTEyMAouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNjE0NzQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYxNTI0Ci5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA2MTY0MgouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNjIwMTcKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyMDIwCi5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA2MjAyOAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NjIwOTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyMDk2Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA2MjE0NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjIx +NzYKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyMTg4Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA2MjI1NAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjIzNzQK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyNDgyCi5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA2MjQ5NgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjI1MDEKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyNTA4Ci5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA2MjUxOQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjI1NTQKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDYyNzQxCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA2Mjc5NAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjMxNjAKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDYzMzU5Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2 +MzUxMgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjM2NjgKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDYzNjkyCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2Mzc2 +MwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjM3NjQKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDYzODI2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NDEyNwou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjQzMTIKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDY0NzA1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NDgwNwouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNjUxMjAKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDY1MTY4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NTI0OQouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNjUyODcKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDY1MzM3Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NTU0MQouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNjU3MTUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY1 +NzM1Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NTc1NgouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNjYxMTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY2MTM2 +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NjE0MAouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNjY0NjUKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY2ODgxCi5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2Njk1MAouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNjY5NTkKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY3NDM1Cnd3dy5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NzQ3OQouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNjc1MjgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY3NTQ1Ci5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA2NzU3MgouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNjc2NDgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY3NjUwCi5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA2NzY4MAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +Njc2OTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY3ODcxCi5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA2NzkyMwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjgy +NDgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY4Mjc4Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA2ODM3OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjg0ODMK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY4NTA2Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA2ODU0NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjg2MTYKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY4NjIyCi5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA2ODcwNwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjkxNDYKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDY5MzczCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA2OTUxNgouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjk1MTcKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDY5Njg3Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2 +OTc0MQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjk4NjEKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDY5OTUyCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3MDA1 +MwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzAxNzcKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDcwMzA3Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3MDgwOQou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzA5OTAKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDcxMDQyCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3MTA0NAouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNzExMDYKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDcxMTY2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3MTE4MQpmdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA3MTIwMAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NzEyMDgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcxMjM4Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA3MjI3MQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzIz +NDgKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcyNjc3Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA3Mjc5NAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzI4NTMK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcyODk1Ci5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA3Mjk5MwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzMwNDMKLmZ0 +Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDczMTAzCi5mdGNoaW5lc2UuY29tL3N0b3J5 +LzAwMTA3MzE1NwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzMyMTYKLmZ0Y2hp +bmVzZS5jb20vc3RvcnkvMDAxMDczMjQ2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAw +MTA3MzMwNQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzMzMDcKLmZ0Y2hpbmVz +ZS5jb20vc3RvcnkvMDAxMDczNDA4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3 +MzUzNwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzM2NzIKLmZ0Y2hpbmVzZS5j +b20vc3RvcnkvMDAxMDczOTA2Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDA4 +OQouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzQxMTAKLmZ0Y2hpbmVzZS5jb20v +c3RvcnkvMDAxMDc0MTI4Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDE1Nwou +ZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzQyNDYKLmZ0Y2hpbmVzZS5jb20vc3Rv +cnkvMDAxMDc0MzA3Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDM0NwouZnRj +aGluZXNlLmNvbS9zdG9yeS8wMDEwNzQ0MjMKLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv +MDAxMDc0NDU0Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDQ2NwouZnRjaGlu +ZXNlLmNvbS9zdG9yeS8wMDEwNzQ0OTMKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx +MDc0NTUwCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDU2MgouZnRjaGluZXNl +LmNvbS9zdG9yeS8wMDEwNzQ2NTMKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc0 +NjkzCi5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDY5OQouZnRjaGluZXNlLmNv +bS9zdG9yeS8wMDEwNzQ3MTIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc0NzEz +Ci5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDc2OAouZnRjaGluZXNlLmNvbS9z +dG9yeS8wMDEwNzQ3ODIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc0Nzk0Ci5m +dGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDgyMgouZnRjaGluZXNlLmNvbS9zdG9y +eS8wMDEwNzQ4NzQKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc0ODkxCi5mdGNo +aW5lc2UuY29tL3N0b3J5LzAwMTA3NDkxOAouZnRjaGluZXNlLmNvbS9zdG9yeS8w +MDEwNzUwODEKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc1MjE2Ci5mdGNoaW5l +c2UuY29tL3N0b3J5LzAwMTA3NTIzMAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw +NzUyNjIKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc1MjY5Ci5mdGNoaW5lc2Uu +Y29tL3N0b3J5LzAwMTA3NTUwMAouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzU2 +NTAKLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc1Njc4Ci5mdGNoaW5lc2UuY29t +L3N0b3J5LzAwMTA3NTcwMwouZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzYxNDIK +LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc2NDcwCi5mdGNoaW5lc2UuY29tL3N0 +b3J5LzAwMTA3NjUzOAouZnRjaGluZXNlLmNvbS90YWcvJUU1JThEJTgxJUU1JTg1 +JUFCJUU1JUIxJThBJUU0JUI4JTg5JUU0JUI4JUFEJUU1JTg1JUE4JUU0JUJDJTlB +Ci5mdGNoaW5lc2UuY29tL3RhZy8lRTYlQjglQTklRTUlQUUlQjYlRTUlQUUlOUQK +LmZ0Y2hpbmVzZS5jb20vdGFnLyVFOCU5NiU4NCVFNyU4NiU5OSVFNiU5RCVBNQou +ZnRjaGluZXNlLmNvbS92aWRlby8xNDM3Ci5mdGNoaW5lc2UuY29tL3ZpZGVvLzE4 +ODIKLmZ0Y2hpbmVzZS5jb20vdmlkZW8vMjQ0NgouZnRjaGluZXNlLmNvbS92aWRl +by8yNjAxCi5mdGNoaW5lc2UuY29tL2NvbW1lbnRzCi5mdHYuY29tLnR3CmZ1Y2Qu +Y29tCi5mdWNrY25uaWMubmV0Cnx8ZnVja2NubmljLm5ldApmdWNrZ2Z3Lm9yZwp8 +fGZ1bGxlcmNvbnNpZGVyYXRpb24uY29tCmZ1bHVlLmNvbQouZnVuZi50dwpmdW5w +LmNvbQouZnVxLmNvbQouZnVyaGhkbC5vcmcKfHxmdXJpbmthbi5jb20KLmZ1dHVy +ZWNoaW5hZm9ydW0ub3JnCnx8ZnV0dXJlbWVzc2FnZS5vcmcKLmZ1eC5jb20KLmZ1 +eWluLm5ldAouZnV5aW5kaWFudGFpLm9yZwouZnV5dS5vcmcudHcKfHxmdy5jbQou +ZnhjbS1jaGluZXNlLmNvbQp8fGZ4Y20tY2hpbmVzZS5jb20KZnpoOTk5LmNvbQpm +emg5OTkubmV0CmZ6bG0uY29tCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1HRy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0KLmc2aGVudGFpLmNvbQp8aHR0cDovL2c2aGVu +dGFpLmNvbQp8fGctcXVlZW4uY29tCnx8Z2Fib2NvcnAuY29tCi5nYWVwcm94eS5j +b20KLmdhZm9ydW0ub3JnCi5nYWxheHltYWNhdS5jb20KfHxnYWxlbnd1LmNvbQou +Z2Fsc3RhcnMubmV0Cnx8Z2FtZTczNS5jb20KZ2FtZWJhc2UuY29tLnR3CmdhbWVq +b2x0LmNvbQp8aHR0cDovL3dpa2kuZ2FtZXJwLmpwCnx8Z2FtZXIuY29tLnR3Ci5n +YW1lci5jb20udHcKLmdhbWV6LmNvbS50dwp8fGdhbWV6LmNvbS50dwouZ2Ftb3Vz +YS5jb20KLmdhb21pbmcubmV0Cnx8Z2FvbWluZy5uZXQKZ2FuZ2VzLmNvbQouZ2Fv +cGkubmV0CnxodHRwOi8vZ2FvcGkubmV0Ci5nYW96aGlzaGVuZy5vcmcKLmdhb3po +aXNoZW5nLm5ldApnYXJkZW5uZXR3b3Jrcy5jb20KfHxnYXJkZW5uZXR3b3Jrcy5v +cmcKIS0tSVAgb2YgR2FyZGVuIE5ldHdvcmsKNzIuNTIuODEuMjIKfHxnYXJ0bGl2 +ZS5jb20KfHxnYXRlLXByb2plY3QuY29tCnx8Z2F0aGVyLmNvbQouZ2F0aGVycHJv +eHkuY29tCmdhdGkub3JnLnR3Ci5nYXlidWJibGUuY29tCi5nYXljbi5uZXQKLmdh +eWh1Yi5jb20KfHxnYXltYXAuY2MKLmdheXR1YmUuY29tCiEtLXx8Z2F5dHViZS5j +b20KfHxpbWFnZXMtZ2F5dHViZS5jb20KLmdheXdhdGNoLmNvbQp8aHR0cDovL2dh +eXdhdGNoLmNvbQouZ2F6b3R1YmUuY29tCnx8Z2F6b3R1YmUuY29tCnx8Z2NjLm9y +Zy5oawp8fGdjbG9vbmV5LmNvbQouZ2NwbmV3cy5jb20KfGh0dHA6Ly9nY3BuZXdz +LmNvbQouZ2RidC5uZXQvZm9ydW0KZ2R6Zi5vcmcKfHxnZWVrLWFydC5uZXQKZ2Vl +a2VyaG9tZS5jb20vMjAxMC8wMy94aXhpYW5nLXByb2plY3QtY3Jvc3MtZ2Z3Cnx8 +Z2Vla2hlYXJ0LmluZm8KLmdla2lrYW1lLmNvbQp8aHR0cDovL2dla2lrYW1lLmNv +bQouZ2VsYm9vcnUuY29tCnxodHRwOi8vZ2VsYm9vcnUuY29tCiEtLXx8Z2VudWl0 +ZWMuY29tCi5nZW9jaXRpZXMuY28uanAKLmdlb2NpdGllcy5jb20vU2lsaWNvblZh +bGxleS9DaXJjdWl0LzU2ODMvZG93bmxvYWQuaHRtbApoay5nZW9jaXRpZXMuY29t +Cmdlb2NpdGllcy5qcAouZ2VyZWZvdW5kYXRpb24ub3JnCnx8Z2V0YXN0cmlsbC5j +b20KLmdldGNodS5jb20KLmdldGNsb2FrLmNvbQp8fGdldGNsb2FrLmNvbQp8fGdl +dGZveHlwcm94eS5vcmcKLmdldGZyZWVkdXIuY29tCnx8Z2V0Z29tLmNvbQouZ2V0 +aTJwLm5ldAp8fGdldGkycC5uZXQKLmdldGxhbnRlcm4ub3JnCnx8Z2V0bGFudGVy +bi5vcmcKLmdldGpldHNvLmNvbS9mb3J1bQpnZXRpdG9uLmNvbQouZ2V0c29jaWFs +c2NvcGUuY29tCnx8Z2V0c3luYy5jb20KZ2Zidi5kZQouZ2Znb2xkLmNvbS5oawou +Z2ZzYWxlLmNvbQp8fGdmc2FsZS5jb20KZ2Z3Lm9yZy51YQouZ2Z3LnByZXNzCnx8 +Z2Z3LnByZXNzCi5nZ3NzbC5jb20KfHxnZ3NzbC5jb20KfHxnaG9zdC5vcmcKLmdo +b3N0cGF0aC5jb20KfHxnaG9zdHBhdGguY29tCnx8Z2h1dC5vcmcKLmdpYW50ZXNz +bmlnaHQuY29tCnxodHRwOi8vZ2lhbnRlc3NuaWdodC5jb20KLmdpZnJlZS5jb20K +fHxnaWdhLXdlYi5qcAp0dy5naWdhY2lyY2xlLmNvbQp8aHR0cDovL2NuLmdpZ2Fu +ZXdzLmNvbS8KZ2lncG9ybm8ucnUKfHxnaXJsYmFua2VyLmNvbQouZ2l0LmlvCnx8 +Z2l0LmlvCnxodHRwOi8vc29mdHdhcmVkb3dubG9hZC5naXRib29rcy5pbwoKIS0t +LUdpdEh1Yi0tLQpnaXRodWIuY29tL2dldGxhbnRlcm4KfGh0dHBzOi8vZ2lzdC5n +aXRodWIuY29tCmh0dHA6Ly9jdGhsby5naXRodWIuaW8vaGt0dgp8fGhhb2VsLmdp +dGh1Yi5pbwohLS18aHR0cDovL29uaW9uaGFja2VyLmdpdGh1Yi5pbwp8fHNvZGF0 +ZWEuZ2l0aHViLmlvCndzZ3phby5naXRodWIuaW8KfGh0dHBzOi8vd3NnemFvLmdp +dGh1Yi5pbwohLS0uZ2l0aHViLmlvCgouZ2l6bGVuLm5ldAp8fGdpemxlbi5uZXQK +LmdqY3p6LmNvbQp8fGdqY3p6LmNvbQpnbG9iYWxqaWhhZC5uZXQKZ2xvYmFsbWVk +aWFvdXRyZWFjaC5jb20KZ2xvYmFsbXVzZXVtb25jb21tdW5pc20ub3JnCnx8Z2xv +YmFscmVzY3VlLm5ldAouZ2xvYmFsdG0ub3JnCi5nbG9iYWx2b2ljZXNvbmxpbmUu +b3JnCnx8Z2xvYmFsdm9pY2Vzb25saW5lLm9yZwp8fGdsb2JhbHZwbi5uZXQKLmds +b2NrLmNvbQpnbHVja21hbi5jb20vRGFsYWlMYW1hCmdtYmQuY24KfHxnbWh6Lm9y +Zwp8aHR0cDovL3d3dy5nbWlkZGxlLmNvbQp8aHR0cDovL3d3dy5nbWlkZGxlLm5l +dAouZ21sbC5vcmcKfHxnbmNpLm9yZy5oawpnby1wa2kuY29tCnx8Z29hZ2VudC5i +aXoKfHxnb2FnZW50cGx1cy5jb20KZ29iZXQuY2MKZ29kZm9vdHN0ZXBzLm9yZwp8 +fGdvZGZvb3RzdGVwcy5vcmcKZ29kbnMud29yawpnb2RzZGlyZWN0Y29udGFjdC5j +by51awouZ29kc2RpcmVjdGNvbnRhY3Qub3JnCmdvZHNkaXJlY3Rjb250YWN0Lm9y +Zy50dwouZ29kc2ltbWVkaWF0ZWNvbnRhY3QuY29tCi5nb2dvdHVubmVsLmNvbQp8 +fGdvaGFwcHkuY29tLnR3Ci5nb2tiYXlyYWsuY29tCi5nb2xkYmV0LmNvbQp8fGdv +bGRiZXRzcG9ydHMuY29tCnx8Z29sZGVuZXlldmF1bHQuY29tCi5nb2xkZW5mcm9n +LmNvbQp8fGdvbGRlbmZyb2cuY29tCi5nb2xkaml6ei5jb20KfGh0dHA6Ly9nb2xk +aml6ei5jb20KLmdvbGRzdGVwLm5ldAp8fGdvbGR3YXZlLmNvbQpnb25nbWVuZy5p +bmZvCmdvbmdtLmluCmdvbmdtaW5saWxpYW5nLmNvbQouZ29uZ3d0LmNvbQp8aHR0 +cDovL2dvbmd3dC5jb20KYmxvZy5nb28ubmUuanAvZHVjay10YWlsXzIwMDkKLmdv +b2RheS54eXoKfGh0dHA6Ly9nb29kYXkueHl6Ci5nb29kcmVhZHMuY29tCnx8Z29v +ZHJlYWRzLmNvbQouZ29vZHJlYWRlcnMuY29tCnx8Z29vZHJlYWRlcnMuY29tCi5n +b29kdHYuY29tLnR3Ci5nb29kdHYudHYKfHxnb29maW5kLmNvbQouZ29vZ2xlc2ls +ZS5jb20KLmdvcGV0aXRpb24uY29tCnx8Z29wZXRpdGlvbi5jb20KLmdvcHJveGlu +Zy5uZXQKLmdvdHJ1c3RlZC5jb20KfHxnb3RydXN0ZWQuY29tCnx8Z290dy5jYQp8 +fGdyYW1tYWx5LmNvbQpncmFuZHRyaWFsLm9yZwouZ3JhcGhpcy5uZS5qcAp8fGdy +YXBoaXMubmUuanAKfHxncmFwaHFsLm9yZwohLS18fHMuZ3JhdmF0YXIuY29tCmdy +ZWF0ZmlyZXdhbGwuYml6Cnx8Z3JlYXRmaXJld2FsbG9mY2hpbmEubmV0Ci5ncmVh +dGZpcmV3YWxsb2ZjaGluYS5vcmcKfHxncmVhdGZpcmV3YWxsb2ZjaGluYS5vcmcK +fHxncmVlbmZpZWxkYm9va3N0b3JlLmNvbS5oawouZ3JlZW5wYXJ0eS5vcmcudHcK +fHxncmVlbnBlYWNlLm9yZwouZ3JlZW5yZWFkaW5ncy5jb20vZm9ydW0KZ3JlYXQt +ZmlyZXdhbGwuY29tCmdyZWF0LXJvYy5vcmcKZ3JlYXRyb2Mub3JnCmdyZWF0emhv +bmdodWEub3JnCi5ncmVlbnBlYWNlLmNvbS50dwouZ3JlZW52cG4ubmV0Cnx8Z3Jl +ZW52cG4ubmV0Ci5ncmVlbnZwbi5vcmcKZ3MtZGlzY3Vzcy5jb20KfHxndHJpY2tz +LmNvbQpndWFuY2hhLm9yZwouZ3VhcmRzdGVyLmNvbQouZ3VuLXdvcmxkLm5ldApn +dW5zYW5kYW1tby5jb20KfHxndXR0ZXJ1bmNlbnNvcmVkLmNvbQp8fGd2bS5jb20u +dHcKLmd6bS50dgp8fGd6b25lLWFuaW1lLmluZm8KCiEtLS0tLS0tLS0tLS0tR0hT +LS0tLS0KIS18fGZlZWRzLmNic25ld3MuY29tCiEtfHx3d3cuY2hpbmVzZWFsYnVt +YXJ0LmNvbQp8fGNsZW1lbnRpbmUtcGxheWVyLm9yZwohLXx8Y2xlbWVzaGEub3Jn +CiEtfHx3d3cuY2xvdWRnaXJsZnJpZW5kLmNvbQohLXx8Y29jb2F3aXRobG92ZS5j +b20KIS18fGJsb2cuY29udHJvbHNwYWNlLm9yZwohLUQKIS18fHd3dy5kYWlseWd5 +YW4uY29tCiEtfHxkYWlseXRvZG8ub3JnCiEtfHxibG9nLmRhbm1hcm5lci5jb20K +IS18fGdpdGh1Yi5kYW5tYXJuZXIuY29tCiEtfHxkZXNpZ24tc2VlZHMuY29tCiEt +fHxkZXNpZ25lcnMtYXJ0aXN0cy5jb20KIS18fG1haWwuZGl5YW5nLm9yZwohLXx8 +YmxvZy5kb3VnaGVsbG1hbm4uY29tCiEtfHxkb3duZm9yZXZlcnlvbmVvcmp1c3Rt +ZS5jb20KIS18fGRyb2lkc2VjdXJpdHkuY29tCiEtfHx3d3cuZHJvcG1vY2tzLmNv +bQohLXx8ZHVtYmxpdHRsZW1hbi5jb20KIS1FCmVjaG9mb24uY29tCiEtfHxlY2hv +Zm9uLmNvbQohLXx8ZXBjLWphdi5jb20KIS18fGV2ZXJkYXJrLmluZm8KIS18fGV2 +aGVhZC5jb20KIS1GCiEtfHxmYWNpbGVsb2dpbi5jb20KIS18fCouZmF0ZHVjay5v +cmcKIS18fGJsb2cuZmRjbi5vcmcKIS18fGZmdG9nby5jb20KIS18fGZsaWdodHNp +bXRhbGsuY29tCiEtfHxtY2xlZS5mb29sbWUubmV0CiEtfHx3d3cuZnJpZW5kZGVj +ay5jb20KIS18fGZyaW5nZXNwb2lsZXJzLmNvbQohLXx8ZnJpbmdldGVsZXZpc2lv +bi5jb20KIS18fGZ1bnBlYS5jb20KIS1HCiEtfHxibG9nLmdhdGVpbi5vcmcKIS18 +fGZlZWRzLmdhd2tlci5jb20KIS18fGdlZWt0YW5nLmNvbQohLXx8Z2VvaG90LnVz +CiEtfHxnZXRhcm91bmQuY29tCiEtfHxnbWVyLm5ldAohLXx8d3d3Lmdtb3RlLm9y +ZwohLXx8YmxvZy5nbzJ3ZWIyMC5uZXQKIS18fGdvb2dsZS1tZWxhbmdlLmNvbQoh +LXx8ZmFtZS5nb256b2xhYnMub3JnCiEtfHxnb3ZlY24ub3JnCiEtfHxncXVldWVz +LmNvbQohLXx8Z3JhcGh5Y2FsYy5jb20KfHxncmVhc2VzcG90Lm5ldAohLXx8Ymxv +Zy5ncm93bGZvcndpbmRvd3MuY29tCiEtSAohLXx8aGNtLmNvbS50dwohLXx8Ymxv +Zy5oZWFkaXVzLmNvbQohLXx8aG9nYmF5c29mdHdhcmUuY29tCiEtfHxibG9nLmhv +dG90Lm9yZwohLXx8ZmVlZHMuaG93c3R1ZmZ3b3Jrcy5jb20KIS18fGh1aGFpdGFp +LmNvbQohLXx8YmxvZy5odW1hbnJpZ2h0c2ZpcnN0Lm9yZwohLUkKIS18fHNpdGUu +aWN1LXByb2plY3Qub3JnCiEtfHxpZ29yd2FyZS5jb20KIS18fGloYXMxMzM3Y29k +ZS5jb20KIS18fGlua25vdXZlYXUuY29tCiEtfHxpbm90ZS50dwohLXx8aXJvbmhl +bG1ldC5jb20KIS18fGl3ZndjZi5jb20KIS1KCiEtfHxibG9nLmphbmdtdC5jb20K +IS18fGJsb2cuamF5ZmllbGRzLmNvbQohLXx8YmxvZy5qb2ludC5uZXQKIS18fGJs +b2cuanNxdWFyZWRqYXZhc2NyaXB0LmNvbQohLXx8YmxvZy5qdGJ3b3JsZC5jb20K +IS1LCiEtfHxrYXRoeXNjaHdhbGJlLmNvbQohLXx8dG9tYXRvdnBuLmtlaXRobW95 +ZXIuY29tCiEtfHx3d3cua2VpdGhtb3llci5jb20KIS18fGtlbmRhbHZhbmR5a2Uu +Y29tCiEtfHxibG9nLmtlbmdhby50dwohLXx8bG9nLmtlc28uY24KIS18fHd3dy5r +aGFuYWNhZGVteS5vcmcKfHx3d3cua2xpcC5tZQohLXx8dXNibG9hZGVyZ3gua291 +cmVpby5uZXQKIS18fGJsb2cua293YWxjenlrLmluZm8KIS1MCiEtfHxsYWJ5cmlu +dGgyLmNvbQohLXx8bGFyc2dlb3JnZS5jb20KIS18fGJsb2cubGFzdHBhc3MuY29t +CiEtfHxkb2NzLmxhdGV4bGFiLm9yZwohLXx8bGVhbmVzc2F5cy5jb20KIS18fGJs +b2cubGlkYW9iaW5nLmluZm8KIS18fGxvZy5saWdodG9yeS5uZXQKIS18fGZlZWRz +LmxpbWkubmV0CiEtfHx3d3cubGl0ZWFwcGxpY2F0aW9ucy5jb20KIS18fGJsb2cu +bGl1a2FuZ3h1LmluZm8KIS18fHR3aXR0ZXIubGl1a2FuZ3h1LmluZm8KIS18fG9h +c2lzbmV3c3Jvb20ubGl2ZTRldmVyLnVzCiEtfHx3d3cubG9ja2VyZ25vbWUuY29t +CiEtfHxsb2NxbC5jb20KQEB8fHNpdGUubG9jcWwuY29tCiEtfHxmZWVkcy5sb2lj +bGVtZXVyLmNvbQohLXx8YmxvZy5sb3Vpc2dyYXkuY29tCiEtTQohLXx8bWFkZWJ5 +c29mYS5jb20KIS18fG1hZGVtb2lzZWxsZXJvYm90LmNvbQohLXx8bWFzYW1peGVz +LmNvbQohLXx8d3d3Lm1ldGFtdXNlLm5ldAohLXx8YmxvZy5tZXRhc3Bsb2l0LmNv +bQohLXx8bWlsYXppLmNvbQohLXx8d3d3Lm1pbml3ZWF0aGVyLmNvbQohLXx8dHdp +dHRlci5taXNzaXUuY29tCiEtfHxwbHVya3RvcC1idXR0b24ubW1kYXlzLmNvbQoh +LXx8ZmVlZHMubW9iaWxlcmVhZC5jb20KIS18fHd3dy5tb2Rlcm5penIuY29tCiEt +fHx3d3cubW9kay5pdAohLXx8bXl0d2lzaGlydC5jb20KIS1OCiEtfHxibG9nLm5l +dGZsaXguY29tCiEtfHxibG9nLm5paGlsb2dpYy5kawohLXx8bnRsay5vcmcKIS18 +fG52cXVhbi5vcmcKIS18fG5vZ29vZGF0Y29kaW5nLmNvbQohLXx8YmxvZy5ub3Rk +b3QubmV0CiEtfHx3d3cubm90aWZ5LmlvCiEtTwohLXx8YmxvZy5vYnZpb3VzLmNv +bQohLXx8b25lYmlnZmx1a2UuY29tCiEtfHxvdmVyc3RpbXVsYXRlLmNvbQohLVAK +IS18fHBjZ2Vla2Jsb2cuY29tCiEtfHxmZWVkcy5wZGZjaG0ubmV0CiEtfHxmZWVk +cy5wZW9wbGUuY29tCiEtfHxibG9nLnBlcnNpc3RlbnQuaW5mbwohLXx8Y2hyb21l +LnBsYW50c3Zzem9tYmllcy5jb20KIS18fHBvcnRhYmxlc29mdC5vcmcucnUKIS18 +fHByYXNhbm5hdGVjaC5uZXQKIS18fHRhbGsubmV3cy5wdHMub3JnLnR3CiEtfHxw +eXRob24tZXhjZWwub3JnCiEtUQohLVIKIS18fHItY2hhcnQuY29tCiEtfHxyYW1l +c2hzdWJyYW1hbmlhbi5vcmcKIS18fHJhcGlkLnBrCiEtfHxibG9nLnJlZGRpdC5j +b20KIS18fGJsb2cucmVuYW5zZS5jb20KIS18fHJvYmVydG1hby5jb20KIS18fHd3 +dy5yb21lby1mb3h0cm90LmNvbQohLVMKIS18fHNhbG1peXVjay5jb20KIS18fHNh +bXNhbC5jb20KIS18fGJsb2cuc2VlbWluZ2xlZS5jb20KIS18fGJsb2cuc2Zsb3cu +Y29tCiEtfHxibG9nLnNpZ2ZwZS5jb20KIS18fHNpbXBsZXRleHQud3MKIS18fHd3 +dy5za3VscHQub3JnCiEtfHxyc3Muc2xhc2hkb3Qub3JnCiEtfHxzbmlwcGV0c2Fw +cC5jb20KIS18fHcuc25zLmx5CiEtfHx3d3cuc29jaWFsbm1vYmlsZS5jb20KIS18 +fHd3dy5zb2NpYWx3aG9pcy5jb20KIS18fHNwaXJpdGpiLm9yZwohLXx8c3Nib29r +LmNvbQohLXx8c3NoZm9yd2FyZGluZy5jb20KIS18fHN0YXRpb25lcmlhLmNvbQp8 +fHN0ZXBoYW5pZXJlZC5jb20KIS18fHN1bmppZG9uZy5uZXQKIS18fHN5bml1bXNv +ZnR3YXJlLmNvbQpAQHx8ZG93bmxvYWQuc3luaXVtc29mdHdhcmUuY29tCiEtVAoh +LXx8dGFneGVkby5jb20KIS18fGJsb2cudGF0b2ViYS5vcmcKIS18fHd3dy50ZWNo +Zm9iLmNvbQohLXx8dGVhY2hwYXJlbnRzdGVjaC5vcmcKIS18fHRoZThwZW4uY29t +CiEtfHx0aGVpcGhvbmV3aWtpLmNvbQohLXx8YmxvZy50aGVzaWxlbnRudW1iZXIu +bWUKIS18fHRoZXNwb250eS5jb20KIS18fHRoZXVsdHJhbGlueC5jb20KIS18fGJs +b2cudGhpbmstYXN5bmMuY29tCiEtfHx0b3JuYWRvd2ViLm9yZwohLXx8dHJhbnNw +YXJlbnR1cHRpbWUuY29tCiEtfHx0cmlhbmd1bGF0aW9uYmxvZy5jb20KIS18fGJs +b2cudHN1bmFuZXQubmV0CiEtfHxlbi50dXhlcm8uY29tCiEtfHx0d2F6enVwLmNv +bQohLXx8dHdlZXRzd2VsbC5jb20KIS18fHR3aWJlcy5jb20KIS18fGFydC50d2dn +Lm9yZwohLXx8dHdpdmVydC5jb20KIS1VCnxodHRwOi8vdWIwLmNjCiEtfHxqb25u +eS51YnVudHUtdHcubmV0CiEtfHxibG9nLnVtb25rZXkubmV0CiEtVgohLXx8dHAu +dmJhcC5jb20uYXUKIS18fHd3dy52aXJ0dW91c3JvbS5jb20KIS18fGJsb2cudmlz +aWJvdGVjaC5jb20KIS1XCiEtfHx3YXZlcHJvdG9jb2wub3JnCiEtfHx3d3cud2F2 +ZXNhbmRib3guY29tCiEtfHx3ZWJmZWUub3JnLnJ1CiEtfHxibG9nLndlYm1wcm9q +ZWN0Lm9yZwohLXx8d2VidXBkOC5vcmcKIS18fHd3dy53aGF0YnJvd3Nlci5vcmcK +IS18fHd3dy53aGVyZWRveW91Z28ubmV0CiEtfHx3aWxsaGFpbnMuY29tCiEtfHxm +ZWVkcy53aXJlZC5jb20KIS18fHdpc2VtYXBwaW5nLm9yZwp3b3p5LmluCiEtfHx3 +b3p5LmluLwohLXx8YmxvZy53dW5kZXJjb3VudGVyLmNvbQohLVgKIS18fHhkZWx0 +YS5vcmcKIS18fHhpYW9nYW96aS5vcmcKIS18fHhpbG91LnVzCiEtfHx4enkub3Jn +LnJ1CiEtWQohLXx8eW9vcGVyLmJlCiEtfHx0c29uZy55dW54aS5uZXQKIS1aCgpn +b3NwZWxoZXJhbGQuY29tCnx8Z29zcGVsaGVyYWxkLmNvbQp8aHR0cDovL2hrLmdy +YWRjb25uZWN0aW9uLmNvbS8KfHxncmFuZ29yei5vcmcKZ3JlYXRmaXJlLm9yZwp8 +fGdyZWF0ZmlyZS5vcmcKZ3JlYXRmaXJld2FsbG9mY2hpbmEub3JnCnx8Z3JlYXRy +b2MudHcKLmd0cy12cG4uY29tCnxodHRwOi8vZ3RzLXZwbi5jb20KLmd1LWNodS1z +dW0ub3JnCnxodHRwOi8vZ3UtY2h1LXN1bS5vcmcKLmd1YWd1YXNzLmNvbQp8aHR0 +cDovL2d1YWd1YXNzLmNvbQouZ3VhZ3Vhc3Mub3JnCnxodHRwOi8vZ3VhZ3Vhc3Mu +b3JnCi5ndWFuZ21pbmcuY29tLm15Cmd1aXNoYW4ub3JnCnx8Z3Vpc2hhbi5vcmcK +Lmd1bXJvYWQuY29tCnx8Z3Vtcm9hZC5jb20KfHxndW5zYW1lcmljYS5jb20KZ3Vy +dW9ubGluZS5oawp8aHR0cDovL2d2bGliLmNvbQouZ3lhbHdhcmlucG9jaGUuY29t +Ci5neWF0c29zdHVkaW8uY29tCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1ISC0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0KLmg1MjguY29tCi5oNWRtLmNvbQouaDVnYWxn +YW1lLm1lCnx8aC1jaGluYS5vcmcKLmgtbW9lLmNvbQp8aHR0cDovL2gtbW9lLmNv +bQpoMW4xY2hpbmEub3JnCi5oYWNnLmNsdWIKfHxoYWNnLmNsdWIKLmhhY2cuaW4K +fGh0dHA6Ly9oYWNnLmluCi5oYWNnLmxpCnxodHRwOi8vaGFjZy5saQouaGFjZy5t +ZQp8aHR0cDovL2hhY2cubWUKLmhhY2cucmVkCnxodHRwOi8vaGFjZy5yZWQKLmhh +Y2tlbi5jYy9iYnMKLmhhY2tlci5vcmcKfHxoYWNrdGhhdHBob25lLm5ldApoYWhs +by5jb20KfHxoYWtrYXR2Lm9yZy50dwouaGFuZGNyYWZ0ZWRzb2Z0d2FyZS5vcmcK +fGh0dHA6Ly9iYnMuaGFubWluenUub3JnLwouaGFudW55aS5jb20KLmhhby5uZXdz +L25ld3MKfGh0dHA6Ly9hZS5oYW8xMjMuY29tCnxodHRwOi8vYXIuaGFvMTIzLmNv +bQp8aHR0cDovL2JyLmhhbzEyMy5jb20KfGh0dHA6Ly9lbi5oYW8xMjMuY29tCnxo +dHRwOi8vaWQuaGFvMTIzLmNvbQp8aHR0cDovL2pwLmhhbzEyMy5jb20KfGh0dHA6 +Ly9tYS5oYW8xMjMuY29tCnxodHRwOi8vbXguaGFvMTIzLmNvbQp8aHR0cDovL3Nh +LmhhbzEyMy5jb20KfGh0dHA6Ly90aC5oYW8xMjMuY29tCnxodHRwOi8vdHcuaGFv +MTIzLmNvbQp8aHR0cDovL3ZuLmhhbzEyMy5jb20KfGh0dHA6Ly9oay5oYW8xMjNp +bWcuY29tCnxodHRwOi8vbGQuaGFvMTIzaW1nLmNvbQp8fGhhcHB5LXZwbi5jb20K +LmhhcHJveHkub3JnCnx8aGFyZHNleHR1YmUuY29tCi5oYXJ1bnlhaHlhLmNvbQp8 +aHR0cDovL2hhcnVueWFoeWEuY29tCmJicy5oYXNpLndhbmcKaGF2ZTguY29tCkBA +fHxoYXlnby5jb20KLmhjbGlwcy5jb20KfHxoZGx0Lm1lCnx8aGR0dmIubmV0Ci5o +ZHpvZy5jb20KfGh0dHA6Ly9oZHpvZy5jb20KfHxoZWFydHlpdC5jb20KLmhlYy5z +dQp8aHR0cDovL2hlYy5zdQouaGVjYWl0b3UubmV0Cnx8aGVjYWl0b3UubmV0Ci5o +ZWNoYWppLmNvbQp8fGhlY2hhamkuY29tCnx8aGVlYWN0LmVkdS50dwouaGVncmUt +YXJ0LmNvbQp8aHR0cDovL2hlZ3JlLWFydC5jb20KfHxjZG4uaGVsaXhzdHVkaW9z +Lm5ldAp8fGhlbHBsaW5mZW4uY29tCnx8aGVsbG9hbmRyb2lkLmNvbQp8fGhlbGxv +cXVlZXIuY29tCi5oZWxsb3NzLnB3CmhlbGxvdHh0LmNvbQp8fGhlbGxvdHh0LmNv +bQouaGVudGFpLnRvCi5oZWxsb3VrLm9yZy9mb3J1bS9sb2ZpdmVyc2lvbgouaGVs +cGVhY2hwZW9wbGUuY29tCnx8aGVscGVhY2hwZW9wbGUuY29tCnx8aGVscHN0ZXIu +ZGUKLmhlbHB6aHVsaW5nLm9yZwpoZW50YWl0dWJlLnR2Ci5oZW50YWl2aWRlb3dv +cmxkLmNvbQoKISMjIyMjIyMjIyMjLS1IZXJva3UtLSMjIyMjIyMjIyMKIS0tfHxn +ZXRjbG91ZGFwcC5jb20KIS0tfHxjbC5seQohLS1AQHx8Zi5jbC5seQohLS1FQzIg +RE5TIFBvaXNvbmVkCnx8aWQuaGVyb2t1LmNvbQoKaGVxaW5nbGlhbi5uZXQKfHxo +ZXVuZ2tvbmdkaXNjdXNzLmNvbQouaGV4aWVzaGUuY29tCnx8aGV4aWVzaGUuY29t +Cnx8aGV4aWVzaGUueHl6CiEtLUdvb2dsZSBlbXBsb3llZSB3aXRoaW4gR29vZ2xl +IElQCnx8aGV4eGVoLm5ldAphcHAuaGV5d2lyZS5jb20KLmhleXpvLmNvbQouaGdz +ZWF2LmNvbQouaGhkY2Izb2ZmaWNlLm9yZwouaGh0aGVzYWt5YXRyaXppbi5vcmcK +aGktb24ub3JnLnR3CmhpZGRlbi1hZHZlbnQub3JnCnx8aGlkZGVuLWFkdmVudC5v +cmcKaGlkZWNsb3VkLmNvbS9ibG9nLzIwMDgvMDcvMjkvZnVjay1iZWlqaW5nLW9s +eW1waWNzLmh0bWwKfHxoaWRlLm1lCi5oaWRlaW4ubmV0Ci5oaWRlaXB2cG4uY29t +Cnx8aGlkZWlwdnBuLmNvbQouaGlkZW1hbi5uZXQKfHxoaWRlbWFuLm5ldApoaWRl +bWUubmwKfHxoaWRlbXkubmFtZQouaGlkZW15YXNzLmNvbQp8fGhpZGVteWFzcy5j +b20KaGlkZW15Y29tcC5jb20KfHxoaWRlbXljb21wLmNvbQouaGloaWZvcnVtLmNv +bQouaGloaXN0b3J5Lm5ldAp8fGhpaGlzdG9yeS5uZXQKLmhpZ2Z3LmNvbQpoaWdo +cGVha3NwdXJlZWFydGguY29tCnx8aGlnaHJvY2ttZWRpYS5jb20KfHxoaWl0Y2gu +Y29tCnx8aGlraW5nZ2Z3Lm9yZwouaGlsaXZlLnR2Ci5oaW1hbGF5YW4tZm91bmRh dGlvbi5vcmcKaGltYWxheWFuZ2xhY2llci5jb20KLmhpbWVtaXguY29tCnx8aGlt ZW1peC5jb20KLmhpbWVtaXgubmV0CnRpbWVzLmhpbmV0Lm5ldAouaGl0b21pLmxh -CnxodHRwOi8vaGl0b21pLmxhCmhpemJ1dHRhaHJpci5vcmcKaGl6Yi11dC10YWhy -aXIuaW5mbwpoaXpiLXV0LXRhaHJpci5vcmcKLmhqY2x1Yi5pbmZvCi5oay1wdWIu -Y29tL2ZvcnVtCnxodHRwOi8vaGstcHViLmNvbQouaGswMS5jb20KLmhrMzIxNjgu -Y29tCnx8aGszMjE2OC5jb20KLmhrYXR2bmV3cy5jb20KaGtiYy5uZXQKLmhrYmYu -b3JnCi5oa2Jvb2tjaXR5LmNvbQp8fGhrYm9va2NpdHkuY29tCi5oa2NodXJjaC5v -cmcKLmhrY21pLmVkdQp8fGhrY29jLmNvbQpoa2RheS5uZXQKLmhrZGFpbHluZXdz -LmNvbS5oay9jaGluYS5waHAKaGtkZi5vcmcKLmhrZWouY29tCi5oa2VwYy5jb20v -Zm9ydW0vdmlld3RocmVhZC5waHA/dGlkPTExNTMzMjIKY2hpbmEuaGtldC5jb20K -fHxoa2ZhYS5jb20KaGtmcmVlem9uZS5jb20KaGtmcm9udC5vcmcKbS5oa2dhbGRl -bi5jb20KfGh0dHBzOi8vbS5oa2dhbGRlbi5jb20KaGtnb2xkZW4uY29tCi5oa2dy -ZWVucmFkaW8ub3JnL2hvbWUKLmhraGVhZGxpbmUuY29tKmJsb2cKLmhraGVhZGxp -bmUuY29tL2luc3RhbnRuZXdzCmhraGtoay5jb20KaGtocmMub3JnLmhrCmhraHJt -Lm9yZy5oawp8fGhraXAub3JnLnVrCjE5ODlyZXBvcnQuaGtqYS5vcmcuaGsKaGtq -Yy5jb20KLmhranAub3JnCi5oa2xmdC5jb20KLmhrbHRzLm9yZy5oawp8fGhrbHRz -Lm9yZy5oawpuZXdzLmhrcGVhbnV0LmNvbQpoa3B0dS5vcmcKLmhrcmVwb3J0ZXIu -Y29tCnx8aGtyZXBvcnRlci5jb20KfGh0dHA6Ly9oa3Vwb3AuaGt1LmhrLwouaGt1 -c3UubmV0Cnx8aGt1c3UubmV0Ci5oa3Z3ZXQuY29tCi5oa3djYy5vcmcuaGsKfHxo -a3pvbmUub3JnCmhuamhqLmNvbQp8fGhuamhqLmNvbQouaG5udHViZS5jb20KfHxo -b2xhLmNvbQp8fGhvbGEub3JnCmhvbHltb3VudGFpbmNuLmNvbQpob2x5c3Bpcml0 -c3BlYWtzLm9yZwp8fGhvbHlzcGlyaXRzcGVha3Mub3JnCnx8ZGVyZWtoc3UuaG9t -ZWlwLm5ldAouaG9tZXBlcnZlcnNpb24uY29tCnxodHRwOi8vaG9tZXNlcnZlcnNo -b3cuY29tCnxodHRwOi8vb2xkLmhvbmV5bmV0Lm9yZy9zY2Fucy9zY2FuMzEvc3Vi -L2RvdWdfZXJpYy9zcGFtX3RyYW5zbGF0aW9uLmh0bWwKLmhvbmdrb25nZnAuY29t -Cnx8aG9uZ2tvbmdmcC5jb20KaG9uZ21laW1laS5jb20KfHxob25nemhpLmxpCmhv -b3RzdWl0ZS5jb20KfHxob290c3VpdGUuY29tCi5ob3B0by5vcmcKLmhvcm55Z2Ft -ZXIuY29tCi5ob3Rhdi50dgpob3Rmcm9nLmNvbS50dwpob3Rnb28uY29tCi5ob3Rw -b3Juc2hvdy5jb20KaG90cG90LmhrCi5ob3RzaGFtZS5jb20KfHxob3RzcG90c2hp -ZWxkLmNvbQouaG90dnBuLmNvbQp8fGhvdHZwbi5jb20KfHxob3VnYWlnZS5jb20K -fHxob3d0b2ZvcmdlLmNvbQouaHFjZHAub3JnCnx8aHFjZHAub3JnCnx8aHFqYXBh -bmVzZXNleC5jb20KaHFtb3ZpZXMuY29tCi5ocmNpci5jb20KLmhyY2NoaW5hLm9y -ZwouaHJlYS5vcmcKLmhyaWNoaW5hLm9yZwp8fGhyaWNoaW5hLm9yZwouaHJ3Lm9y -Zwp8fGhydy5vcmcKaHJ3ZWIub3JnCnx8aHNqcC5uZXQKfHxoc3NlbGl0ZS5jb20K -fGh0dHA6Ly9oc3QubmV0LnR3Ci5oc3Rlcm4ubmV0Ci5oc3R0Lm5ldAouaHRrb3Uu -bmV0Cnx8aHRrb3UubmV0Cnx8aHRtbGRvZy5jb20KLmh1YS15dWUubmV0Cmh1YWds -YWQuY29tCi5odWFuZ2h1YWdhbmcub3JnCnx8aHVhbmdodWFnYW5nLm9yZwouaHVh -bmd5aXl1LmNvbQouaHVhcmVuLnVzCnx8aHVhcmVuLnVzCmh1YXhpYS1uZXdzLmNv -bQpodWF4aWFiYW8ub3JnCmh1YXhpbi5waAp8fGh1YXl1d29ybGQub3JnCi5odWZm -aW5ndG9ucG9zdC5jb20vcmViaXlhLWthZGVlcgp8fGh1Z29yb3kuZXUKfHxodWhh -aXRhaS5jb20KfHxodWhhbWhpcmUuY29tCmh1aXlpLmluCi5odWxrc2hhcmUuY29t -Cmh1bWFucmlnaHRzYnJpZWZpbmcub3JnCnx8aHVuZy15YS5jb20KfHxodW5nZXJz -dHJpa2Vmb3JhaWRzLm9yZwp8fGh1cGluZy5uZXQKaHVyZ29rYmF5cmFrLmNvbQou -aHVycml5ZXQuY29tLnRyCi5odXQyLnJ1Cnx8aHV0aWFueWkubmV0Cmh1dG9uZzku -bmV0Cmh1eWFuZGV4LmNvbQp8fGh3YXl1ZS5vcmcudHcKfHxod2luZm8uY29tCnxo -dHRwOi8vZmFuZy1saXpoaS5oeHdrLm9yZy8KaHh3cS5vcmcKfHxoeXBlcnJhdGUu -Y29tCmVib29rLmh5cmVhZC5jb20udHcKfHxlYm9vay5oeXJlYWQuY29tLnR3Cgoh -LS0tLS0tLS0tLS0tLS0tLS0tLS1JSS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K -fHxpMS5oawp8fGkycDIuZGUKfHxpMnJ1bm5lci5jb20KfHxpODE4aGsuY29tCi5p -LWNhYmxlLmNvbQouaS1wYXJ0LmNvbS50dwppYXNrLmNhCnx8aWFzay5jYQppYXNr -LmJ6Cnx8aWFzay5iegouaWF2MTkuY29tCmliaWJsaW8ub3JnL3B1Yi9wYWNrYWdl -cy9jY2ljCi5pYmxpc3QuY29tCnx8aWJsb2dzZXJ2LWYubmV0Cmlicm9zLm9yZwp8 -aHR0cDovL2NuLmlidGltZXMuY29tCi5pYnZwbi5jb20KfHxpYnZwbi5jb20KaWNh -bXMuY29tCmJsb2dzLmljZXJvY2tldC5jb20vdGFnCi5pY2lqLm9yZwp8fGljaWou -b3JnCnx8aWNsLWZpLm9yZwouaWNvY28uY29tCnx8aWNvY28uY29tCgohLS0zOC4x -MDMuMTY1LjUwCnx8ZnVyYm8ub3JnCiEtLXx8aWNvbmZhY3RvcnkuY29tCnx8d2Fy -Ymxlci5pY29uZmFjdG9yeS5uZXQKCnx8aWNvbnBhcGVyLm9yZwohLS0gR29vZ2xl -IFBhZ2VzCnx8aWN1LXByb2plY3Qub3JnCncuaWRhaXdhbi5jb20vZm9ydW0KaWRl -bW9jcmFjeS5hc2lhCi5pZGVudGkuY2EKfHxpZGVudGkuY2EKfHxpZGlvbWNvbm5l -Y3Rpb24uY29tCnxodHRwOi8vd3d3LmlkbGNveW90ZS5jb20KLmlkb3VnYS5jb20K -LmlkcmVhbXguY29tCmZvcnVtLmlkc2FtLmNvbQouaWR2LnR3CmllYXN5bmV3cy5u -ZXQKLmllZDJrLm5ldAouaWVuZXJneTEuY29tCnxodHRwOi8vaWYudHR0LwppZmFu -cWlhbmcuY29tCi5pZmFuci5jb20vODU3Ci5pZmNzcy5vcmcKfHxpZmNzcy5vcmcK -aWZqYy5vcmcKLmlmdC50dAp8aHR0cDovL2lmdC50dAp8fGlmcmVld2FyZXMuY29t -Cnx8aWdjZC5uZXQKLmlnZncubmV0Cnx8aWdmdy5uZXQKLmlnbWcuZGUKfHxpZ25p -dGVkZXRyb2l0Lm5ldAouaWdvdG1haWwuY29tLnR3Cnx8aWd2aXRhLmNvbQp8fGlo -YWtrYS5uZXQKLmloYW8ub3JnL2R6NQp8fGlpY25zLmNvbQp8fGlsbHVzaW9uZmFj -dG9yeS5jb20KfHxpbG92ZTgwLmJlCnx8aW0udHYKQEB8fG15dmxvZy5pbS50dgp8 -fGltODgudHcKLmltZ2NoaWxpLm5ldAp8aHR0cDovL2ltZ2NoaWxpLm5ldAouaW1h -Z2VhYi5jb20KLmltYWdlZmFwLmNvbQp8fGltYWdlZmFwLmNvbQp8fGltYWdlZmxl -YS5jb20KaW1hZ2VzaGFjay51cwp8fGltYWdldmVudWUuY29tCnx8aW1hZ2V6aWxs -YS5uZXQKLmltYi5vcmcKfGh0dHA6Ly9pbWIub3JnCgohLS1JTURCCnxodHRwOi8v -d3d3LmltZGIuY29tL25hbWUvbm0wNDgyNzMwCi5pbWRiLmNvbS90aXRsZS90dDA4 -MTkzNTQKLmltZGIuY29tL3RpdGxlL3R0MTU0MDA2OAouaW1kYi5jb20vdGl0bGUv -dHQ0OTA4NjQ0CgouaW1nLmx5Cnx8aW1nLmx5Ci5pbWtldi5jb20KfHxpbWtldi5j -b20KLmltbGl2ZS5jb20KLmltbW9yYWwuanAKaW1wYWN0Lm9yZy5hdQppbXBwLm1u -CnxodHRwOi8vdGVjaDIuaW4uY29tL3ZpZGVvLwppbjk5Lm9yZwppbi1kaXNndWlz -ZS5jb20KLmluY2FwZG5zLm5ldAouaW5jbG9hay5jb20KfHxpbmNsb2FrLmNvbQp8 -fGluY3JlZGlib3guZnIKfHxpbmRpYW5kZWZlbnNlbmV3cy5pbgp0aW1lc29maW5k -aWEuaW5kaWF0aW1lcy5jb20vZGFsYWkKLmluZGllbWVyY2guY29tCnx8aW5kaWVt -ZXJjaC5jb20KaW5mby1ncmFmLmZyCndlYnNpdGUuaW5mb3JtZXIuY29tCi5pbml0 -aWF0aXZlc2ZvcmNoaW5hLm9yZwouaW5rdWkuY29tCi5pbm1lZGlhaGsubmV0Cnx8 -aW5tZWRpYWhrLm5ldAp8fGlubmVybW9uZ29saWEub3JnCnxodHRwOi8vYmxvZy5p -bm9yZWFkZXIuY29tCi5pbm90ZS50dwouaW5zZWNhbS5vcmcKfGh0dHA6Ly9pbnNl -Y2FtLm9yZwouaW5zdGFncmFtLmNvbQp8fGluc3RhZ3JhbS5jb20KLmluc3RpdHV0 -LXRpYmV0YWluLm9yZwp8fGludGVyZmFjZWFkZGljdGlvbi5jb20KfHxpbnRlcm5h -dGlvbmFscml2ZXJzLm9yZwp8aHR0cDovL2ludGVybmV0Lm9yZy8KaW50ZXJuZXRk -ZWZlbnNlbGVhZ3VlLm9yZwppbnRlcm5ldGZyZWVkb20ub3JnCiEtLXx8aW50ZXJw -b2wuaW50Cnx8aW50ZXJuZXRwb3BjdWx0dXJlLmNvbQppbnhpYW4uY29tCnx8aW54 -aWFuLmNvbQppcGFsdGVyLmNvbQp8fGlwY2Yub3JnLnR3Cnx8aXBob25lNGhvbmdr -b25nLmNvbQp8fGlwaG9uZWhhY2tzLmNvbQp8fGlwaG9uZXRhaXdhbi5vcmcKfHxp -cGhvbml4LmZyCnx8aXBpY3R1cmUucnUKLmlwamV0YWJsZS5uZXQKfHxpcGpldGFi -bGUubmV0Ci5pcG9iYXIuY29tL3JlYWQucGhwPwouaXBvcnRhbC5tZQp8aHR0cDov -L2lwb3J0YWwubWUKfHxpcHBvdHYuY29tCi5pcHJlZGF0b3Iuc2UKfHxpcHJlZGF0 -b3Iuc2UKLmlwdHYuY29tLnR3Cnx8aXB2YW5pc2guY29tCmlyZWRtYWlsLm9yZwpj -aGluZXNlLmlyaWIuaXIKfHxpcm9uaWNzb2Z0d2FyZS5jb20KfHxpcm9uYmlnZm9v -bHMuY29tcHl0aG9uLm5ldAp8fGlyb25weXRob24ubmV0Ci5pcy5nZAouaXNsYW0u -b3JnLmhrCnxodHRwOi8vaXNsYW0ub3JnLmhrCi5pc2xhbWF3YXJlbmVzcy5uZXQv -QXNpYS9DaGluYQouaXNsYW1ob3VzZS5jb20KfHxpc2xhbWhvdXNlLmNvbQouaXNs -YW1pY2l0eS5jb20KLmlzbGFtaWNwbHVyYWxpc20ub3JnCi5pc2xhbXRvZGF5Lm5l -dAouaXNhYWNtYW8uY29tCnx8aXNhYWNtYW8uY29tCnx8aXNncmVhdC5vcmcKfHxp -c21hZWxhbi5jb20KLmlzbWFsbHRpdHMuY29tCnx8aXNtcHJvZmVzc2lvbmFsLm5l -dAppc29odW50LmNvbQp8fGlzcmFib3guY29tCi5pc3N1dS5jb20KfHxpc3N1dS5j -b20KLmlzdGFycy5jby5uegpvdmVyc2VhLmlzdGFyc2hpbmUuY29tCnx8b3ZlcnNl -YS5pc3RhcnNoaW5lLmNvbQpibG9nLmlzdGVmLmluZm8vMjAwNy8xMC8yMS9teWVu -dHVubmVsCi5pc3RpcWxhbGhld2VyLmNvbQouaXN0b2NrcGhvdG8uY29tCmlzdW5h -ZmZhaXJzLmNvbQppc3VudHYuY29tCml0YWJvby5pbmZvCnx8aXRhYm9vLmluZm8K -Lml0YWxpYXRpYmV0Lm9yZwpkb3dubG9hZC5pdGhvbWUuY29tLnR3Cml0aGVscC5p -dGhvbWUuY29tLnR3Cnx8aXRzaGlkZGVuLmNvbQouaXRza3kuaXQKLml0d2VldC5u -ZXQKfGh0dHA6Ly9pdHdlZXQubmV0Ci5pdTQ1LmNvbQp8fGl1aHJkZi5vcmcKLml1 -a3NreS5jb20KLml2YWN5LmNvbQp8fGl2YWN5LmNvbQouaXZlcnljZC5jb20KLml2 -cG4ubmV0CiEtLXx8aXZwbi5uZXQKfHxpeHF1aWNrLmNvbQouaXh4eC5jb20KaXlv -dXBvcnQuY29tCnx8aXlvdXBvcnQuY29tCi5pemFvYmFvLnVzCnx8Z21vem9tZy5p -emlob3N0Lm9yZwouaXpsZXMubmV0Ci5pemxlc2VtLm9yZwoKIS0tLS0tLS0tLS0t -LS0tLS0tLS0tSkotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnx8ai5tcApibG9n -LmphY2tqaWEuY29tCmphbWFhdC5vcmcKLmphbXlhbmdub3JidS5jb20KfGh0dHA6 -Ly9qYW15YW5nbm9yYnUuY29tCnx8amFud29uZ3Bob3RvLmNvbQp8fGphcGFuLXdo -b3Jlcy5jb20KLmphdjY4LnR2Ci5qYXZoZC5jb20KLmphdmhpcC5jb20KLmphdmFr -aWJhLm9yZwp8aHR0cDovL2phdmFraWJhLm9yZwouamF2YnVzLmNvbQp8fGphdmZv -ci5tZQouamF2bW9vLmNvbQouamF2c2Vlbi5jb20KfGh0dHA6Ly9qYXZzZWVuLmNv -bQpqYnRhbGtzLmNjCmpidGFsa3MuY29tCmpidGFsa3MubXkKLmpkd3N5LmNvbQpq -ZWFueWltLmNvbQp8fGpnb29kaWVzLmNvbQouamlhbmd3ZWlwaW5nLmNvbQp8fGpp -YW5nd2VpcGluZy5jb20KfHxqaWFveW91OC5jb20KLmppZWh1YS5jegp8fGhrLmpp -ZXBhbmcuY29tCnx8dHcuamllcGFuZy5jb20Kamllc2hpYmFvYmFvLmNvbQo1NmN1 -bjA0LmppZ3N5LmNvbQpqaWdvbmcxMDI0LmNvbQpkYW9kdTE0LmppZ3N5LmNvbQpz -cGVjeGluemwuamlnc3kuY29tCndsY25ldy5qaWdzeS5jb20KamluYnVzaGUub3Jn -Cnx8amluYnVzaGUub3JnCi5qaW5nc2ltLm9yZwp6aGFvLmppbmhhaS5kZQpqaW5n -cGluLm9yZwp8fGppbmdwaW4ub3JnCmppbnBpYW53YW5nLmNvbQphYy5qaXJ1YW4u -bmV0Cnx8aml0b3VjaC5jb20KLmppenp0aGlzLmNvbQpqamdpcmxzLmNvbQouamti -LmNjCnxodHRwOi8vamtiLmNjCmprZm9ydW0ubmV0Cnx8am1hLmdvLmpwCnJlc2Vh -cmNoLmptc2MuaGt1LmhrL3NvY2lhbAp3ZWlib3Njb3BlLmptc2MuaGt1LmhrCnx8 -am9hY2hpbXMub3JnCnx8am9ic28udHYKfHxqb2VlZGVsbWFuLmNvbQouam91cm5h -bGNocmV0aWVuLm5ldAp8fGpvdXJuYWxvZmRlbW9jcmFjeS5vcmcKLmpveW1paWh1 -Yi5jb20KanBvcGZvcnVtLm5ldAohLS1Eb2FtaW4gcGFya2luZwouanVodWFyZW4u -Y29tCnx8anVsaWVyZXljLmNvbQp8fGp1bmF1emEuY29tCi5qdW5lNGNvbW1lbW9y -YXRpb24ub3JnCi5qdW5lZm91cnRoLTIwLm5ldAp8fGp1bmVmb3VydGgtMjAubmV0 -Ci5qdW9hYS5jb20KfGh0dHA6Ly9qdW9hYS5jb20KanVzdGZyZWV2cG4uY29tCi5q -dXN0aWNlZm9ydGVuemluLm9yZwpqdXN0cGFzdGUuaXQKanVzdHRyaXN0YW4uY29t -Cmp1eXVhbmdlLm9yZwpqdXppeXVlLmNvbQp8fGp1eml5dWUuY29tCnx8andtdXNp -Yy5vcmcKQEB8fG11c2ljLmp3bXVzaWMub3JnCi5qeXhmLm5ldAoKIS0tLS0tLS0t -LS0tLS0tLS0tLS0tS0stLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnx8a2Etd2Fp -LmNvbQoua2FneXVvZmZpY2Uub3JnCnx8a2FneXVvZmZpY2Uub3JnCnx8a2FneXVv -ZmZpY2Uub3JnLnR3Ci5rYWl5dWFuLmRlCi5rYWthby5jb20KfHxrYWthby5jb20K -Lmthbmthbi50b2RheQoua2FubmV3eW9yay5jb20KLmthbnNoaWZhbmcuY29tCnx8 -a2Fuc2hpZmFuZy5jb20Ka2FuemhvbmdndW8uY29tCmthbnpob25nZ3VvLmV1Ci5r -YW90aWMuY29tCnx8a2FyYXlvdS5jb20Ka2Fya2h1bmcuY29tCi5rYXJtYXBhLm9y -Zwoua2FybWFwYS10ZWFjaGluZ3Mub3JnCi5rYmEtdHgub3JnCi5rY29vbG9ubGlu -ZS5jb20KfHxrY3NvZnR3YXJlcy5jb20KLmtlYnJ1bS5jb20KfHxrZWJydW0uY29t -Ci5rZWNoYXJhLmNvbQoua2VlcGFuZHNoYXJlLmNvbS92aXNpdC92aXNpdF9wYWdl -LnBocD9pPTY4ODE1NAohLS18fGtlZXB2aWQuY29tCi5rZW5kaW5jb3MubmV0Ci5r -ZW5lbmdiYS5jb20KfHxrZW5lbmdiYS5jb20KfHxrZW9udGVjaC5uZXQKLmtlcGFy -ZC5jb20KfHxrZXBhcmQuY29tCndpa2kua2Vzby5jbi9Ib21lCnx8a2V5Y2RuLmNv -bQoua2hhYmRoYS5vcmcKLmtobXVzaWMuY29tLnR3Cnx8a2ljaGlrdS1kb3VqaW5r -by5jb20KYmJzLmtpbXkuY29tLnR3Ci5raW5kbGVyZW4uY29tCnxodHRwOi8va2lu -ZGxlcmVuLmNvbQp8aHR0cDovL3d3dy5raW5kbGVyZW4uY29tCi5raW5nZG9tc2Fs -dmF0aW9uLm9yZwpraW5naG9zdC5jb20KIS0tLmtpbmdzdG9uZS5jb20udHcvYm9v -ay8KfHxraW5nc3RvbmUuY29tLnR3Ci5raW5rLmNvbQpraWxsd2FsbC5jb20KfHxr -aWxsd2FsbC5jb20KLmtpci5qcAoua2lzc2JiYW8uY24KfGh0dHA6Ly9raXdpLmt6 -Cnx8a2std2h5cy5jby5qcAohLS18fGttdC5vcmcudHcKLmtub3dsZWRnZXJ1c2gu -Y29tL2tyL2VuY3ljbG9wZWRpYQp8fGtvZGluZ2VuLmNvbQpAQHx8d3d3LmtvZGlu -Z2VuLmNvbQp8fGtvbXBvemVyLm5ldAoua29uYWNoYW4uY29tCnxodHRwOi8va29u -YWNoYW4uY29tCnx8a29vbHNvbHV0aW9ucy5jb20KLmtvb3Juay5jb20KfHxrb29y -bmsuY29tCnx8a29yYW5tYW5kYXJpbi5jb20KfGh0dHA6Ly9nb2pldC5rcnRjby5j -b20udHcKLmtzbmV3cy5jb20udHcKfHxrdHpoay5jb20KLmt1aS5uYW1lL2V2ZW50 -Cmt1bi5pbQoua3VyYXNoc3VsdGFuLmNvbQp8fGt1cnRtdW5nZXIuY29tCmt1c29j -aXR5LmNvbQp8fGt1c29zLmNvbQp8fGt3Y2cuY2EKa3dvbmd3YWguY29tLm15Ci5r -eW9mdW4uY29tCmt5b2hrLm5ldAp8fGt5b3l1ZS5jb20KLmt6ZW5nLmluZm8KfHxr -emVuZy5pbmZvCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1MTC0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0KbGEtZm9ydW0ub3JnCmxhZGJyb2tlcy5jb20KfHxsYWJpZW5u -YWxlLm9yZwpsYWdyYW5lcG9jYS5jb20KLmxhbHVsYWx1LmNvbQoubGFtYXllc2hl -LmNvbQp8aHR0cDovL2xhbWF5ZXNoZS5jb20KfGh0dHA6Ly93d3cubGFtZW5odS5j -b20KLmxhbW5pYS5jby51awp8fGxhbW5pYS5jby51awpsYW1yaW0uY29tCi5sYW50 -ZXJuY24uY24KfGh0dHA6Ly9sYW50ZXJuY24uY24KLmxhbnRvc2ZvdW5kYXRpb24u -b3JnCi5sYW9kLmNuCnxodHRwOi8vbGFvZC5jbgpsYW9nYWkub3JnCnx8bGFvZ2Fp -Lm9yZwpsYW9taXUuY29tCi5sYW95YW5nLmluZm8KfGh0dHA6Ly9sYW95YW5nLmlu -Zm8KfHxsYXB0b3Bsb2NrZG93bi5jb20KLmxhcWluZ2Rhbi5uZXQKfHxsYXFpbmdk -YW4ubmV0Cnx8bGFyc2dlb3JnZS5jb20KLmxhc3Rjb21iYXQuY29tCnxodHRwOi8v -bGFzdGNvbWJhdC5jb20KfHxsYXN0Zm0uZXMKbGF0ZWxpbmVuZXdzLmNvbQoubGF0 -aWJldC5vcmcKfHxsZS12cG4uY29tCi5sZWFmeXZwbi5uZXQKfHxsZWFmeXZwbi5u -ZXQKbGVlYW8uY29tLmNuL2Jicy9mb3J1bS5waHAKIS0tfHxsZWVjaGV1a3lhbi5v -cmcKbGVmb3JhLmNvbQp8fGxlZnQyMS5oawoubGVnYWxwb3Juby5jb20KfGh0dHA6 -Ly9sZWlyZW50di5jYQpsZWlzdXJlY2FmZS5jYQp8fGxlbWF0aW4uY2gKLmxlbW9u -ZGUuZnIKfHxsZW53aGl0ZS5jb20KbGVyb3N1YS5vcmcKfHxsZXJvc3VhLm9yZwpi -bG9nLmxlc3Rlcjg1MC5pbmZvCnx8bGVzb2lyLmJlCmxldHNjb3JwLm5ldAp8fGxl -dHNjb3JwLm5ldAoubGhha2FyLm9yZwp8aHR0cDovL2xoYWthci5vcmcKLmxoYXNv -Y2lhbHdvcmsub3JnCi5saWFuZ3lvdS5uZXQKfHxsaWFuZ3lvdS5uZXQKLmxpYW55 -dWUubmV0Cnx8bGlhb3dhbmd4aXphbmcubmV0Ci5saWFvd2FuZ3hpemFuZy5uZXQK -fHxsaWJlcmFsLm9yZy5oawoubGliZXJ0eXRpbWVzLmNvbS50dwpibG9ncy5saWJy -YXJ5aW5mb3JtYXRpb250ZWNobm9sb2d5LmNvbS9qeHl6Ci5saWRlY2hlbmcuY29t -L2Jsb2cvZnVja2luZy1nZncKLmxpZ2h0ZW4ub3JnLnR3CmxpbWlhby5uZXQKbGlu -a3Vzd2VsbC5jb20KYWJpdG5vLmxpbnBpZS5jb20vdXNlLWlwdjYtdG8tZnVjay1n -ZncKfHxsaW5lLm1lCi5saW5nbGluZ2ZhLmNvbQp8fGxpbmd2b2RpY3MuY29tCi5s -aW5raWRlby5jb20KfHxhcGkubGlua3NhbHBoYS5jb20KfHxhcGlkb2NzLmxpbmtz -YWxwaGEuY29tCnx8d3d3LmxpbmtzYWxwaGEuY29tCnx8aGVscC5saW5rc2FscGhh -LmNvbQp8fGxpbnV4Lm9yZy5oawpsaW51eHRveS5vcmcvYXJjaGl2ZXMvaW5zdGFs -bGluZy13ZXN0LWNoYW1iZXItb24tdWJ1bnR1Ci5saW9uc3JvYXIuY29tCi5saXB1 -bWFuLmNvbQp8fGdyZWF0ZmlyZS51czcubGlzdC1tYW5hZ2UuY29tCnx8bGlzdGVu -dG95b3V0dWJlLmNvbQpsaXN0b3Jpb3VzLmNvbQp8fGxpdWRlanVuLmNvbQoubGl1 -aGFueXUuY29tCi5saXVqaWFuc2h1LmNvbQp8fGxpdWppYW5zaHUuY29tCmxpdXhp -YW90b25nLmNvbQp8fGxpdXhpYW90b25nLmNvbQoubGl2ZWRvb3IuanAKLmxpdmVs -ZWFrLmNvbQp8fGxpdmVsZWFrLmNvbQoubGl2ZXN0YXRpb24uY29tCmxpdmVzdHJl -YW0uY29tCnx8bGl2ZXN0cmVhbS5jb20KfHxsaXZpbmdvbmxpbmUudXMKfHxsaXZp -bmdzdHJlYW0uY29tCnx8bGl2ZXZpZGVvLmNvbQoubGl2ZXZpZGVvLmNvbQoubGl3 -YW5neWFuZy5jb20KbGl6aGl6aHVhbmdiaS5jb20KbGtjbi5uZXQKLmxvYWQudG8K -LmxvYnNhbmd3YW5neWFsLmNvbQoubG9jYWxkb21haW4ud3MKfHxsb2NhbGRvbWFp -bi53cwpsb2NhbHByZXNzaGsuY29tCnx8bG9ja2Rvd24uY29tCnx8bG9ja2VzdGVr -LmNvbQpsb2dib3QubmV0Cnx8bG9naXF4LmNvbQpzZWN1cmUubG9nbWVpbi5jb20K -fHxzZWN1cmUubG9nbWVpbi5jb20KfHxsb2dtaWtlLmNvbQoubG9uZG9uY2hpbmVz -ZS5jYQoubG9uZ2hhaXIuaGsKbG9uZ211c2ljLmNvbQp8fGxvbmd0ZXJtbHkubmV0 -Cnx8bG9va2luZ2dsYXNzdGhlYXRyZS5vcmcKfHxsb29rcGljLmNvbQoubG9va3Rv -cm9udG8uY29tCnxodHRwOi8vbG9va3Rvcm9udG8uY29tCi5sb3RzYXdhaG91c2Uu -b3JnL3RpYmV0YW4tbWFzdGVycy9mb3VydGVlbnRoLWRhbGFpLWxhbWEKLmxvdHVz -bGlnaHQub3JnLmhrCi5sb3R1c2xpZ2h0Lm9yZy50dwpoa3JlcG9ydGVyLmxvdmVk -LmhrCiEtLTQwMz8KfHxscHNnLmNvbQp8fGxyZnouY29tCi5scmlwLm9yZwp8fGxy -aXAub3JnCi5sc2Qub3JnLmhrCnx8bHNkLm9yZy5oawpsc2ZvcnVtLm5ldAoubHNt -Lm9yZwp8fGxzbS5vcmcKLmxzbWNoaW5lc2Uub3JnCnx8bHNtY2hpbmVzZS5vcmcK -LmxzbWtvcmVhbi5vcmcKfHxsc21rb3JlYW4ub3JnCi5sc21yYWRpby5jb20vcmFk -X2FyY2hpdmVzCi5sc213ZWJjYXN0LmNvbQoubHRuLmNvbS50dwp8aHR0cDovL2x0 -bi5jb20udHcKLmx1a2U1NC5jb20KLmx1a2U1NC5vcmcKLmx1cG0ub3JnCnx8bHVw -bS5vcmcKfHxsdXNoc3Rvcmllcy5jb20KbHV4ZWJjLmNvbQpsdmhhaS5vcmcKfHxs -dmhhaS5vcmcKfHxsdnYyLmNvbQoubHlmaGsubmV0CnxodHRwOi8vbHlmaGsubmV0 -CgohLS0tLS0tLS0tLS0tLS0tLS0tLS1NTS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0KLm0tdGVhbS5jYwohLS1tLXRlYW0uY2MvZm9ydW0KLm1hY3JvdnBuLmNvbQpt -YWN0cy5jb20udHcKfHxtYWQtYXIuY2gKfHxtYWR0aHVtYnMuY29tCnx8bWFnaWMt -bmV0LmluZm8KbWFoYWJvZGhpLm9yZwpteS5tYWlsLnJ1Ci5tYWlwbHVzLmNvbQp8 -aHR0cDovL21haXBsdXMuY29tCi5tYWl6aG9uZy5vcmcKbWFuaWN1cjRpay5ydQou -bWFwbGV3LmNvbQp8aHR0cDovL21hcGxldy5jb20KfHxtYXJjLmluZm8KbWFyZ3Vl -cml0ZS5zdQp8fG1hcnRpbmNhcnRvb25zLmNvbQptYXNrZWRpcC5jb20KLm1haWlv -Lm5ldAptYWlsLWFyY2hpdmUuY29tCi5tYWxheXNpYWtpbmkuY29tCnx8bWFrZW15 -bW9vZC5jb20KLm1hbmlhc2guY29tCnxodHRwOi8vbWFuaWFzaC5jb20KLm1hbnNp -b24uY29tCi5tYW5zaW9ucG9rZXIuY29tCiEtLXx8bWFyaW5lcy5taWwKIS0tbWFy -a21haWwub3JnKm1lc3NhZ2UKfHxtYXJ0YXUuY29tCnxodHRwOi8vYmxvZy5tYXJ0 -aW5vZWkuY29tCi5tYXJ0c2FuZ2thZ3l1b2ZmaWNpYWwub3JnCnxodHRwOi8vbWFy -dHNhbmdrYWd5dW9mZmljaWFsLm9yZwptYXJ1dGEuYmUvZm9yZ2V0Ci5tYXJ4aXN0 -LmNvbQp8fG1hcnhpc3QubmV0Ci5tYXJ4aXN0cy5vcmcvY2hpbmVzZQohLS18fG1h -c2hhYmxlLmNvbQp8fG1hdGFpbmphLmNvbQp8fG1hdGhhYmxlLmlvCnx8bWF0aGll -dy1iYWRpbW9uLmNvbQp8fG1hdHN1c2hpbWFrYWVkZS5jb20KfGh0dHA6Ly9tYXR1 -cmVqcC5jb20KbWF5aW1heWkuY29tCi5tYXhpbmcuanAKLm1jYWYuZWUKfGh0dHA6 -Ly9tY2FmLmVlCnx8bWNhZGZvcnVtcy5jb20KbWNmb2cuY29tCm1jcmVhc2l0ZS5j -b20KLm1kLXQub3JnCnx8bWQtdC5vcmcKLm1lZGlhLm9yZy5oawoubWVkaWFjaGlu -ZXNlLmNvbQp8fG1lZGlhY2hpbmVzZS5jb20KLm1lZGlhZmlyZS5jb20vPwoubWVk -aWFmaXJlLmNvbS9kb3dubG9hZAoubWVkaWFmcmVha2NpdHkuY29tCnx8bWVkaWFm -cmVha2NpdHkuY29tCi5tZWRpdW0uY29tCnx8bWVkaXVtLmNvbQoubWVldGF2LmNv -bQp8fG1lZXR1cC5jb20KbWVmZWVkaWEuY29tCi5tZWdhcG9ybi5jb20KfHxtZWdh -cHJveHkuY29tCnx8bWVnYXJvdGljLmNvbQptZWdhdmlkZW8uY29tCnx8bWVndXJp -bmVsdWthLmNvbQptZWlyaXhpYW9jaGFvLmNvbQp8fG1lbG9uLXBlYWNoLmNvbQou -bWVsdG9kYXkuY29tCi5tZW1laGsuY29tCnx8bWVtZWhrLmNvbQptZW1vcnliYnMu -Y29tCi5tZW1yaS5vcmcKLm1lbXJpanR0bS5vcmcKLm1lcmN5cHJvcGhldC5vcmcK -fGh0dHA6Ly9tZXJjeXByb3BoZXQub3JnCi5tZXJpZGlhbi10cnVzdC5vcmcKfGh0 -dHA6Ly9tZXJpZGlhbi10cnVzdC5vcmcKLm1lcmlwZXQuYml6CnxodHRwOi8vbWVy -aXBldC5iaXoKLm1lcmlwZXQuY29tCnxodHRwOi8vbWVyaXBldC5jb20KbWVyaXQt -dGltZXMuY29tLnR3Cm1lc2hyZXAuY29tCi5tZXNvdHcuY29tL2JicwptZXRhY2Fm -ZS5jb20vd2F0Y2gKfHxtZXRlb3JzaG93ZXJzb25saW5lLmNvbQp8aHR0cDovL3d3 -dy5tZXRyby50YWlwZWkvCi5tZXRyb2hrLmNvbS5oay8/Y21kPWRldGFpbCZjYXRl -Z29yeUlEPTIKfHxtZXRyb2xpZmUuY2EKLm1ldHJvcmFkaW8uY29tLmhrCnxodHRw -Oi8vbWV0cm9yYWRpby5jb20uaGsKbWV5b3UuanAKLm1leXVsLmNvbQp8fG1nb29u -LmNvbQp8fG1nc3RhZ2UuY29tCnx8bWg0dS5vcmcKbWhyYWRpby5vcmcKfGh0dHA6 -Ly9taWNoYWVsYW50aS5jb20KfHxtaWNoYWVsbWFya2V0bC5jb20KbWlkZGxlLXdh -eS5uZXQKLm1paGsuaGsvZm9ydW0KLm1paHIuY29tCm1paHVhLm9yZwohLS1JUAp8 -fG1pa2Vzb2x0eXMuY29tCi5taWxwaC5uZXQKfGh0dHA6Ly9taWxwaC5uZXQKLm1p -bHN1cnBzLmNvbQptaW1pYWkubmV0Ci5taW1pdmlwLmNvbQoubWltaXZ2LmNvbQou -bWluZHJvbGxpbmcub3JnCnxodHRwOi8vbWluZHJvbGxpbmcub3JnCi5taW5naHVp -Lm9yLmtyCnxodHRwOi8vbWluZ2h1aS5vci5rcgptaW5naHVpLm9yZwp8fG1pbmdo -dWkub3JnCm1pbmdodWktYS5vcmcKbWluZ2h1aS1iLm9yZwptaW5naHVpLXNjaG9v -bC5vcmcKLm1pbmdqaW5nbGlzaGkuY29tCnx8bWluZ2ppbmdsaXNoaS5jb20KbWlu -Z2ppbmduZXdzLmNvbQp8fG1pbmdqaW5ndGltZXMuY29tCi5taW5ncGFvLmNvbQou -bWluZ3Bhb2NhbmFkYS5jb20KLm1pbmdwYW9tb250aGx5LmNvbQp8aHR0cDovL21p -bmdwYW9tb250aGx5LmNvbQptaW5ncGFvbmV3cy5jb20KLm1pbmdwYW9ueS5jb20K -Lm1pbmdwYW9zZi5jb20KLm1pbmdwYW90b3IuY29tCi5taW5ncGFvdmFuLmNvbQou -bWluZ3NoZW5nYmFvLmNvbQoubWluaGh1ZS5uZXQKLm1pbmlmb3J1bS5vcmcKLm1p -bmlzdHJ5Ym9va3Mub3JnCi5taW56aHVodWEubmV0Cnx8bWluemh1aHVhLm5ldApt -aW56aHV6aGFueGlhbi5jb20KbWluemh1emhvbmdndW8ub3JnCnx8bWlyb2d1aWRl -LmNvbQptaXJyb3Jib29rcy5jb20KdGhlY2VudGVyLm1pdC5lZHUKLm1pdGFvLmNv -bS50dwptaXRiYnMuY29tCi5taXhlcm8uY29tCnx8bWl4ZXJvLmNvbQptaXhwb2Qu -Y29tCi5taXh4LmNvbQp8fG1peHguY29tCnx8bWl6em1vbmEuY29tCi5tazUwMDAu -Y29tCi5tbGNvb2wuY29tCnx8bW1hYXh4LmNvbQpwbHVya3RvcC5tbWRheXMuY29t -Ci5tbW1jYS5jb20KfHxtb2JhdGVrLm5ldAoubW9iaWxlMDEuY29tCnx8bW9iaWxl -d2F5cy5kZQoubW9ieXBpY3R1cmUuY29tCnxodHRwOi8vbW9ieS50bwp8fG1vZWVy -b2xpYnJhcnkuY29tCndpa2kubW9lZ2lybC5vcmcKLm1vZmF4aWVodWkuY29tCi5t -b2Zvcy5jb20KfHxtb2cuY29tCm1vbGlodWEub3JnCnx8bW9uZGV4Lm9yZwp8aHR0 -cDovL3d3dy5tb25sYW1pdC5vcmcKLm1vb25iYnMuY29tCnx8bW9vbmJicy5jb20K -YzE1MjIubW9vby5jb20KfHxtb25pdG9yY2hpbmEub3JnCmJicy5tb3JiZWxsLmNv -bQp8fG1vcm5pbmdzdW4ub3JnCnx8bW9yb25ldGEuY29tCi5tb3RoZXJsZXNzLmNv -bQp8aHR0cDovL21vdGhlcmxlc3MuY29tCm1vdG9yNGlrLnJ1Ci5tb3VzZWJyZWFr -ZXIuY29tCiEtLXx8bW92YWJsZXR5cGUuY29tCi5tb3ZlbWVudHMub3JnCnx8bW92 -ZW1lbnRzLm9yZwp8fG1vdmllZmFwLmNvbQp8fHd3dy5tb3p0dy5vcmcKLm1wM2J1 -c2NhZG9yLmNvbQptcDN5ZS5ldQp8fG1wZXR0aXMuY29tCm1wZmluYW5jZS5jb20K -bXBpbmV3cy5jb20KbXBvbmxpbmUuaGsKbXJ0d2VldC5jb20KfHxtcnR3ZWV0LmNv -bQpuZXdzLmhrLm1zbi5jb20KbmV3cy5tc24uY29tLnR3Cm1zZ3VhbmNoYS5jb20K -Lm1zd2UxLm9yZwp8aHR0cDovL21zd2UxLm9yZwp8fG10aHJ1Zi5jb20KbXVjaG9z -dWNrby5jb20KfHxtdWx0aXBseS5jb20KbXVsdGlwcm94eS5vcmcKbXVsdGl1cGxv -YWQuY29tCi5tdWxsdmFkLm5ldAp8fG11bGx2YWQubmV0Ci5tdW1teXNnb2xkLmNv -bQoubXVybXVyLnR3CnxodHRwOi8vbXVybXVyLnR3Ci5tdXNpY2FkZS5uZXQKLm11 -c2xpbXZpZGVvLmNvbQp8fG11emkuY29tCnx8bXV6aS5uZXQKfHxteDk4MS5jb20K -Lm15LWZvcm1vc2EuY29tCi5teS1wcm94eS5jb20KZm9ydW0ubXk5MDMuY29tCm15 -YWN0aW1lcy5jb20KLm15YXVkaW9jYXN0LmNvbQp8fG15YXVkaW9jYXN0LmNvbQou -bXlhdi5jb20udHcvYmJzCi5teWJicy51cwoubXljYTE2OC5jb20KfHxiYnMubXlj -aGF0LnRvCnx8bXljaGluYW15aG9tZS5jb20KLm15Y2hpbmFteWhvbWUuY29tCi5t -eWNoaW5hbmV0LmNvbQoubXljaGluYW5ld3MuY29tCnx8bXljaGluYW5ld3MuY29t -Ci5teWNoaW5lc2UubmV3cwp8fG15Y25uZXdzLmNvbQp8fG15a29taWNhLm9yZwpt -eWNvdWxkLmNvbS9kaXNjdXoKLm15ZWFzeXR2LmNvbQp8fG15ZWNsaXBzZWlkZS5j -b20KLm15Zm9ydW0uY29tLmhrCnx8bXlmb3J1bS5jb20uaGsKfHxteWZvcnVtLmNv -bS51awoubXlmcmVlY2Ftcy5jb20KLm15ZnJlZXBheXNpdGUuY29tCi5teWZyZXNo -bmV0LmNvbQpmb3J1bS5teW1hamkuY29tCm15bWVkaWFyb20uY29tL2ZpbGVzL2Jv -eAp8fG15bXVzaWMubmV0LnR3Cnx8bXlwYXJhZ2xpZGluZy5jb20KfHxteXBvcGVz -Y3UuY29tCi5teS1wcml2YXRlLW5ldHdvcmsuY28udWsKfHxteS1wcml2YXRlLW5l -dHdvcmsuY28udWsKbXlyYWRpby5oay9wb2RjYXN0Cm15c2luYWJsb2cuY29tCi5t -eXNwYWNlLmNvbQohLS0uYmxvZ3MubXlzcGFjZS5jb20KIS0tfHxibG9ncy5teXNw -YWNlLmNvbQohLS12aWRzLm15c3BhY2UuY29tL2luZGV4LmNmbT9mdXNlYWN0aW9u -PXZpZHMuCiEtLXZpZXdtb3JlcGljcy5teXNwYWNlLmNvbQoubXl0YWxrYm94LmNv -bQoubXl0aXppLmNvbQoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tTk4tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tCnx8bmFhY29hbGl0aW9uLm9yZwpvbGQubmFiYmxlLmNv -bQp8fG5haXRpay5uZXQKLm5ha3V6LmNvbS9iYnMKfHxuYWxhbmRhYm9kaGkub3Jn -Cnx8bmFsYW5kYXdlc3Qub3JnCi5uYW1neWFsLm9yZwpuYW1neWFsbW9uYXN0ZXJ5 -Lm9yZwp8fG5hbXNpc2kuY29tCi5uYW55YW5nLmNvbQp8fG5hbnlhbmcuY29tCi5u -YW55YW5ncG9zdC5jb20KfHxuYW55YW5ncG9zdC5jb20KLm5hbnphby5jb20KIS0t -Lm5hbnphby5jb20vc2MvY2hpbmEvMjAyMjMKIS0tLm5hbnphby5jb20vc2MvaGst -bWFjYXUtdHcKfHxqcGwubmFzYS5nb3YKfHxwZHMubmFzYS5nb3YKfHxzb2xhcnN5 -c3RlbS5uYXNhLmdvdgovXmh0dHBzPzpcL1wvW15cL10rbGluZVwubmF2ZXJcLmpw -LwoubmFraWRvLmNvbQp8fG5ha2lkby5jb20KLm5hb2wuY2EKLm5hb2wuY2MKdWln -aHVyLm5hcm9kLnJ1CmN5YmVyZ2hvc3QubmF0YWRvLmNvbQp8fG5hdGlvbmFsLWxv -dHRlcnkuY28udWsKbmV3cy5uYXRpb25hbGdlb2dyYXBoaWMuY29tL25ld3MvMjAx -NC8wNi8xNDA2MDMtdGlhbmFubWVuLXNxdWFyZQoubmF0aW9uc29ubGluZS5vcmcv -b25ld29ybGQvdGliZXQKfHxuYXZ5ZmFtaWx5Lm5hdnkubWlsCnx8bmF2eXJlc2Vy -dmUubmF2eS5taWwKfHxua28ubmF2eS5taWwKfHx1c25vLm5hdnkubWlsCi5uYnR2 -cG4uY29tCnxodHRwOi8vbmJ0dnBuLmNvbQpuY2N3YXRjaC5vcmcudHcKLm5jaC5j -b20udHcKLm5jbi5vcmcKfHxuY24ub3JnCnx8ZXRvb2xzLm5jb2wuY29tCi5uZGUu -ZGUKLm5kci5kZQoubmVkLm9yZwp8fG5la29zbG92YWtpYS5uZXQKIS0tYmJzbmV3 -Lm5ldGJpZy5jb20KYmJzLm5ldGJpZy5jb20KLm5ldGJpcmRzLmNvbQpuZXRjb2xv -bnkuY29tCmJvbGluLm5ldGZpcm1zLmNvbQp8fG5ldG1lLmNjCm5ldHNuZWFrLmNv -bQoubmV0d29yazU0LmNvbQpuZXR3b3JrZWRibG9ncy5jb20KbmV2ZXJmb3JnZXQ4 -OTY0Lm9yZwpuZXctM2x1bmNoLm5ldAoubmV3LWFraWJhLmNvbQoubmV3OTYuY2EK -Lm5ld2NlbnR1cnltYy5jb20KfGh0dHA6Ly9uZXdjZW50dXJ5bWMuY29tCm5ld2Nl -bnR1cnluZXdzLmNvbQp8fG5ld2NoZW4uY29tCi5uZXdjaGVuLmNvbQoubmV3Z3Jv -dW5kcy5jb20KbmV3aXBub3cuY29tCi5uZXdsYW5kbWFnYXppbmUuY29tLmF1Ci5u -ZXduZXdzLmNhCm5ld3MxMDAuY29tLnR3Ci5uZXdzY24ub3JnCnx8bmV3c2NuLm9y -Zwp8fG5ld3NtaW5lci5jb20KbmV3c3BlYWsuY2Mvc3RvcnkKLm5ld3NhbmNhaS5j -b20KfHxuZXdzYW5jYWkuY29tCi5uZXdzZGguY29tCnx8bmV3c3RhbWFnby5jb20K -fHxuZXdzdGFwYS5vcmcKbmV3c3Rhcm5ldC5jb20KLm5ld3RhaXdhbi5jb20udHcK -bmV3dGFsay50dwp8fG5ld3RhbGsudHcKbmV3eW9ya3RpbWVzLmNvbQp8fG5leG9u -LmNvbQoubmV4dDExLmNvLmpwCi5uZXh0bWFnLmNvbS50dwoKIS0taGsqLm5leHRt -ZWRpYS5jb20KIS0tdHcqLm5leHRtZWRpYS5jb20KIS0tc3RhdGljKi5uZXh0bWVk -aWEuY29tCi5uZXh0bWVkaWEuY29tCgp8fG5leHRvbi1uZXQuanAKbmV4dHR2LmNv -bS50dwp8fGNvLm5nLm1pbAp8fG5nYS5taWwKbmdlbnNpcy5jb20KLm5oZW50YWku -bmV0CnxodHRwOi8vbmhlbnRhaS5uZXQKLm5oay1vbmRlbWFuZC5qcAoubmljb3Zp -ZGVvLmpwL3dhdGNoCiEtLXx8bmljb3ZpZGVvLmpwCnx8bmlnaG9zdC5vcmcKYXYu -bmlnaHRsaWZlMTQxLmNvbQpuaW5lY29tbWVudGFyaWVzLmNvbQoubmluamFjbG9h -ay5jb20KfHxuaW5qYXByb3h5Lm5pbmphCm5pbnRlbmRpdW0uY29tCnRhaXdhbnll -cy5uaW5nLmNvbQp1c21ndGNnLm5pbmcuY29tL2ZvcnVtCnx8bml1c25ld3MuY29t -Cnx8bmphY3RiLm9yZwpuanVpY2UuY29tCnx8bmp1aWNlLmNvbQpubGZyZWV2cG4u -Y29tCgohLS1uby1pcC5jb20jTk9JUAouZ29vZGRucy5pbmZvCi5tYWlsZG5zLnh5 -egoubm8taXAub3JnCi5vcGVuZG4ueHl6CnN5dGVzLm5ldAoud2hvZG5zLnh5egou -emFwdG8ub3JnCgp8fG5vYmVsLnNlCiEtLS5ub2JlbHByaXplLm9yZwohLS18aHR0 -cDovL25vYmVscHJpemUub3JnCm5vYmVscHJpemUub3JnL25vYmVsX3ByaXplcy9w -ZWFjZS9sYXVyZWF0ZXMvMTk4OQpub2JlbHByaXplLm9yZy9ub2JlbF9wcml6ZXMv -cGVhY2UvbGF1cmVhdGVzLzIwMTAKbm9ib2R5Y2Fuc3RvcC51cwp8fG5vYm9keWNh -bnN0b3AudXMKfHxub2tvZ2lyaS5vcmcKfHxub2tvbGEuY29tCm5vb2RsZXZwbi5j -b20KLm5vcmJ1bGluZ2thLm9yZwpub3JkdnBuLmNvbQp8fG5vcmR2cG4uY29tCnx8 -bm92ZWxhc2lhLmNvbQoubmV3cy5ub3cuY29tCnxodHRwOi8vbmV3cy5ub3cuY29t -CiEtLXxodHRwOi8vbmV3cy5ub3cuY29tL2hvbWUqCm5ld3Mubm93LmNvbSUyRmhv -bWUKfHxub3duZXdzLmNvbQoubm93dG9ycmVudHMuY29tCi5ub3lwZi5jb20KfHxu -b3lwZi5jb20KfHxucGEuZ28uanAKLm5wbnQubWUKfGh0dHA6Ly9ucG50Lm1lCi5u -cHMuZ292Ci5ucmsubm8KfHxucmsubm8KLm50ZC50dgp8fG50ZC50dgpudGR0di5j -b20KLm50ZHR2LmNvLmtyCm50ZHR2LmNhCm50ZHR2Lm9yZwpudGR0di5ydQpudGR0 -dmxhLmNvbQoubnRyZnVuLmNvbQp8fGNicy5udHUuZWR1LnR3Ci5udWJpbGVzLm5l -dAp8fG51ZXhwby5jb20KLm51a2lzdHJlYW0uY29tCnx8bnVyZ28tc29mdHdhcmUu -Y29tCi5udXZpZC5jb20KbnV6Y29tLmNvbQoubnZxdWFuLm9yZwoubnd0Y2Eub3Jn -Cnx8bnlhYS5ldQp8fG55YWEuc2UKLm55ZHVzLmNhCm55bG9uLWFuZ2VsLmNvbQpu -eWxvbnN0b2NraW5nc29ubGluZS5jb20KIS0tbnlzaW5ndGFvLmNvbQohLS18fG55 -dC5jb20Kbnl0Y24ubWUKfHxueXRjby5jb20KfGh0dHA6Ly9ueXRpLm1zLwoubnl0 -aW1lcy5jb20KfHxueXRpbWVzLmNvbQp8fG55dGltZy5jb20KdXNlcmFwaS5ueXRs -b2cuY29tCmNuLm55dHN0eWxlLmNvbQoubnpjaGluZXNlLmNvbQp8fG56Y2hpbmVz -ZS5uZXQubnoKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLU9PLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLQpvYnNlcnZlY2hpbmEubmV0Ci5vYnV0dS5jb20Kb2Nhc3Byby5j -b20Kb2NjdXB5dGlhbmFubWVuLmNvbQpvY2xwLmhrCi5vY3JlYW1waWVzLmNvbQp8 -fG9jdG9iZXItcmV2aWV3Lm9yZwpvZmZiZWF0Y2hpbmEuY29tCm9mZmljZW9mdGli -ZXQuY29tCnx8b2dhb2dhLm9yZwp0d3RyMnNyYy5vZ2FvZ2Eub3JnCnd3dzIub2hj -aHIub3JnL2VuZ2xpc2gvYm9kaWVzL2NhdC9kb2NzL25nb3MvSUlfQ2hpbmFfNDEu -cGRmCi5vaWtvcy5jb20udHcvdjQKLm9pa3R2LmNvbQpvaXpvYmxvZy5jb20KLm9r -YXlmcmVlZG9tLmNvbQp8fG9rYXlmcmVlZG9tLmNvbQpva2sudHcKfGh0dHA6Ly9m -aWxteS5vbGFibG9nYS5wbC9wbGF5ZXIKb2xkLWNhdC5uZXQKfHxvbHVtcG8uY29t -Ci5vbHltcGljd2F0Y2gub3JnCm9tZ2lsaS5jb20KfHxvbW5pdGFsay5jb20KfHxv -bW5pdGFsay5vcmcKY2xpbmcub215LnNnCmZvcnVtLm9teS5zZwpuZXdzLm9teS5z -ZwpzaG93Yml6Lm9teS5zZwp8fG9uLmNjCnx8b25lZHJpdmUubGl2ZS5jb20KfHxv -bmlvbi5jaXR5Ci5vbmxpbmVjaGEuY29tCnx8b25saW5leW91dHViZS5jb20Kb25t -b29uLm5ldApvbm1vb24uY29tCi5vbnRoZWh1bnQuY29tCnxodHRwOi8vb250aGVo -dW50LmNvbQoub29wc2ZvcnVtLmNvbQpvcGVuLmNvbS5oawpvcGVuYWxsd2ViLmNv -bQpvcGVuZGVtb2NyYWN5Lm5ldAp8fG9wZW5kZW1vY3JhY3kubmV0Ci5vcGVuZXJ2 -cG4uaW4Kb3BlbmlkLm5ldAp8fG9wZW5pZC5uZXQKLm9wZW5sZWFrcy5vcmcKfHxv -cGVubGVha3Mub3JnCm9wZW52cG4ubmV0Cnx8b3BlbnZwbi5uZXQKfHxvcGVud2Vi -c3Rlci5jb20KLm9wZW53cnQub3JnLmNuCm15Lm9wZXJhLmNvbS9kYWhlbWEKfHxk -ZW1vLm9wZXJhLW1pbmkubmV0Cnd3dy5vcmNoaWRiYnMuY29tCi5vcmdhbmNhcmUu -b3JnLnR3Cm9yZ2FuaGFydmVzdGludmVzdGlnYXRpb24ubmV0Ci5vcmdmcmVlLmNv -bQp8fG9yaWVudC1kb2xsLmNvbQpvcmllbnRhbGRhaWx5LmNvbS5teQp8fG9yaWVu -dGFsZGFpbHkuY29tLm15CiEtLW9yaWVudGFsZGFpbHkub24uY2MKfHxvcm4uanAK -dC5vcnpkcmVhbS5jb20KfHx0Lm9yemRyZWFtLmNvbQp0dWkub3J6ZHJlYW0uY29t -Cnx8b3J6aXN0aWMub3JnCnx8b3Nmb29yYS5jb20KLm90bmQub3JnCnx8b3RuZC5v -cmcKfHxvdHRvLmRlCnx8b3VyZGVhcmFteS5jb20Kb3Vyc29nby5jb20Kb3Vyc3Rl -cHMuY29tLmF1Ci5vdXJzd2ViLm5ldAp8fG91cnR2LmhrCnhpbnFpbWVuZy5vdmVy -LWJsb2cuY29tCnx8b3ZlcnBsYXkubmV0CnNoYXJlLm92aS5jb20vbWVkaWEKfGh0 -dHA6Ly9vd2wubGkKfGh0dHA6Ly9odC5seQp8aHR0cDovL2h0bC5saQp8aHR0cDov -L21hc2gudG8Kd3d3Lm93aW5kLmNvbQp8aHR0cDovL3d3dy5veGlkLml0Cm95YXgu -Y29tCm95Z2hhbi5jb20vd3BzCi5vemNoaW5lc2UuY29tL2Jicwp8fG93Lmx5CmJi -cy5vemNoaW5lc2UuY29tCi5venh3LmNvbQoub3p5b3lvLmNvbQoKIS0tLS0tLS0t -LS0tLS0tLS0tLS0tUFAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnx8cGFjaG9z -dGluZy5jb20KLnBhY2lmaWNwb2tlci5jb20KLnBhY2tldGl4Lm5ldAp8fHBhY29w -YWNvbWFtYS5jb20KLnBhZG1hbmV0LmNvbQpwYWdlMnJzcy5jb20KfHxwYWdvZGFi -b3guY29tCi5wYWxhY2Vtb29uLmNvbQpmb3J1bS5wYWxtaXNsaWZlLmNvbQp8fGVy -aXZlcnNvZnQuY29tCi5wYWxkZW5neWFsLmNvbQpwYWxqb3JwdWJsaWNhdGlvbnMu -Y29tCi5wYWx0YWxrLmNvbQp8fHBhbmFjb20uY28uanAKLnBhbmRhcG93Lm5ldAou -cGFuZGF2cG4tanAuY29tCi5wYW5sdWFuLm5ldAp8fHBhbmx1YW4ubmV0Cnx8cGFv -LXBhby5uZXQKcGFwZXIubGkKcGFwZXJiLnVzCi5wYXJhZGlzZXBva2VyLmNvbQou -cGFydHljYXNpbm8uY29tCi5wYXJ0eXBva2VyLmNvbQoucGFzc2lvbi5jb20KfHxw -YXNzaW9uLmNvbQoucGFzc2lvbnRpbWVzLmhrCnBhc3RlYmluLmNvbQoucGFzdGll -Lm9yZwp8fHBhc3RpZS5vcmcKfHxibG9nLnBhdGh0b3NoYXJlcG9pbnQuY29tCnBi -cy5vcmcvd2diaC9wYWdlcy9mcm9udGxpbmUvZ2F0ZQpwYnMub3JnL3dnYmgvcGFn -ZXMvZnJvbnRsaW5lL3RhbmttYW4KcGJzLm9yZy93Z2JoL3BhZ2VzL2Zyb250bGlu -ZS90aWJldAoKIS0tUGJ3aWtpCnBid2lraS5jb20KfHxwYndvcmtzLmNvbQp8fGRl -dmVsb3BlcnMuYm94Lm5ldAp8fHdpa2kub2F1dGgubmV0Cnx8d2lraS5waG9uZWdh -cC5jb20KfHx3aWtpLmpxdWVyeXVpLmNvbQoKfHxwYnhlcy5jb20KfHxwYnhlcy5v -cmcKcGNkdmQuY29tLnR3Ci5wY2hvbWUuY29tLnR3CnxodHRwOi8vcGNpai5vcmcK -LnBjc3RvcmUuY29tLnR3L250ZHR2YXBzaG9wCnx8cGN0Lm9yZy50dwpwZGV0YWls -cy5jb20KfHxwZHByb3h5LmNvbQp8fHBlYWNlLmNhCnBlYWNlZmlyZS5vcmcKcGVh +CnxodHRwOi8vaGl0b21pLmxhCi5oaXdpZmkuY29tCkBAfHxoaXdpZmkuY29tCmhp +emJ1dHRhaHJpci5vcmcKaGl6Yi11dC10YWhyaXIuaW5mbwpoaXpiLXV0LXRhaHJp +ci5vcmcKLmhqY2x1Yi5pbmZvCi5oay1wdWIuY29tL2ZvcnVtCnxodHRwOi8vaGst +cHViLmNvbQouaGswMS5jb20KfHxoazAxLmNvbQouaGszMjE2OC5jb20KfHxoazMy +MTY4LmNvbQp8fGhrYWNnLmNvbQp8fGhrYWNnLm5ldAouaGthdHZuZXdzLmNvbQpo +a2JjLm5ldAouaGtiZi5vcmcKLmhrYm9va2NpdHkuY29tCnx8aGtib29rY2l0eS5j +b20KLmhrY2h1cmNoLm9yZwpoa2NpLm9yZy5oawouaGtjbWkuZWR1Cnx8aGtjbmV3 +cy5jb20KfHxoa2NvYy5jb20KaGtkYXkubmV0Ci5oa2RhaWx5bmV3cy5jb20uaGsv +Y2hpbmEucGhwCmhrZGYub3JnCi5oa2VqLmNvbQouaGtlcGMuY29tL2ZvcnVtL3Zp +ZXd0aHJlYWQucGhwP3RpZD0xMTUzMzIyCmNoaW5hLmhrZXQuY29tCnx8aGtmYWEu +Y29tCmhrZnJlZXpvbmUuY29tCmhrZnJvbnQub3JnCm0uaGtnYWxkZW4uY29tCnxo +dHRwczovL20uaGtnYWxkZW4uY29tCmhrZ29sZGVuLmNvbQouaGtncmVlbnJhZGlv +Lm9yZy9ob21lCi5oa2hlYWRsaW5lLmNvbSpibG9nCi5oa2hlYWRsaW5lLmNvbS9p +bnN0YW50bmV3cwpoa2hraGsuY29tCmhraHJjLm9yZy5oawpoa2hybS5vcmcuaGsK +fHxoa2lwLm9yZy51awoxOTg5cmVwb3J0LmhramEub3JnLmhrCmhramMuY29tCi5o +a2pwLm9yZwouaGtsZnQuY29tCi5oa2x0cy5vcmcuaGsKfHxoa2x0cy5vcmcuaGsK +bmV3cy5oa3BlYW51dC5jb20KaGtwdHUub3JnCi5oa3JlcG9ydGVyLmNvbQp8fGhr +cmVwb3J0ZXIuY29tCnxodHRwOi8vaGt1cG9wLmhrdS5oay8KLmhrdXN1Lm5ldAp8 +fGhrdXN1Lm5ldAouaGt2d2V0LmNvbQouaGt3Y2Mub3JnLmhrCnx8aGt6b25lLm9y +ZwouaG1vbmdob3QuY29tCnxodHRwOi8vaG1vbmdob3QuY29tCmhuamhqLmNvbQp8 +fGhuamhqLmNvbQouaG5udHViZS5jb20KfHxob2xhLmNvbQp8fGhvbGEub3JnCmhv +bHltb3VudGFpbmNuLmNvbQpob2x5c3Bpcml0c3BlYWtzLm9yZwp8fGhvbHlzcGly +aXRzcGVha3Mub3JnCnx8ZGVyZWtoc3UuaG9tZWlwLm5ldAouaG9tZXBlcnZlcnNp +b24uY29tCnxodHRwOi8vaG9tZXNlcnZlcnNob3cuY29tCnxodHRwOi8vb2xkLmhv +bmV5bmV0Lm9yZy9zY2Fucy9zY2FuMzEvc3ViL2RvdWdfZXJpYy9zcGFtX3RyYW5z +bGF0aW9uLmh0bWwKLmhvbmdrb25nZnAuY29tCnx8aG9uZ2tvbmdmcC5jb20KaG9u +Z21laW1laS5jb20KfHxob25nemhpLmxpCi5ob290c3VpdGUuY29tCnx8aG9vdHN1 +aXRlLmNvbQouaG9wZWRpYWxvZ3VlLm9yZwp8aHR0cDovL2hvcGVkaWFsb2d1ZS5v +cmcKLmhvcHRvLm9yZwouaG9ybnlnYW1lci5jb20KLmhvcm55dHJpcC5jb20KfGh0 +dHA6Ly9ob3JueXRyaXAuY29tCi5ob3Rhdi50dgouaG90ZWxzLmNuCmhvdGZyb2cu +Y29tLnR3CmhvdGdvby5jb20KLmhvdHBvcm5zaG93LmNvbQpob3Rwb3QuaGsKLmhv +dHNoYW1lLmNvbQp8fGhvdHNwb3RzaGllbGQuY29tCi5ob3R2cG4uY29tCnx8aG90 +dnBuLmNvbQp8fGhvdWdhaWdlLmNvbQp8fGhvd3RvZm9yZ2UuY29tCi5ocWNkcC5v +cmcKfHxocWNkcC5vcmcKfHxocWphcGFuZXNlc2V4LmNvbQpocW1vdmllcy5jb20K +LmhyY2lyLmNvbQouaHJjY2hpbmEub3JnCi5ocmVhLm9yZwouaHJpY2hpbmEub3Jn +Cnx8aHJpY2hpbmEub3JnCi5ocncub3JnCnx8aHJ3Lm9yZwpocndlYi5vcmcKfHxo +c2pwLm5ldAp8fGhzc2VsaXRlLmNvbQp8aHR0cDovL2hzdC5uZXQudHcKLmhzdGVy +bi5uZXQKLmhzdHQubmV0Ci5odGtvdS5uZXQKfHxodGtvdS5uZXQKLmh1YS15dWUu +bmV0Ci5odWFnbGFkLmNvbQp8fGh1YWdsYWQuY29tCi5odWFuZ2h1YWdhbmcub3Jn +Cnx8aHVhbmdodWFnYW5nLm9yZwouaHVhbmd5aXl1LmNvbQouaHVhcmVuLnVzCnx8 +aHVhcmVuLnVzCi5odWFyZW40dXMuY29tCi5odWFzaGFuZ25ld3MuY29tCnxodHRw +Oi8vaHVhc2hhbmduZXdzLmNvbQpiYnMuaHVhc2luZy5vcmcKaHVheGlhLW5ld3Mu +Y29tCmh1YXhpYWJhby5vcmcKaHVheGluLnBoCnx8aHVheXV3b3JsZC5vcmcKLmh1 +ZmZpbmd0b25wb3N0LmNvbS9yZWJpeWEta2FkZWVyCnx8aHVnb3JveS5ldQp8fGh1 +aGFpdGFpLmNvbQp8fGh1aGFtaGlyZS5jb20KaHVpeWkuaW4KLmh1bGtzaGFyZS5j +b20KaHVtYW5yaWdodHNicmllZmluZy5vcmcKfHxodW5nLXlhLmNvbQp8fGh1bmdl +cnN0cmlrZWZvcmFpZHMub3JnCnx8aHVwaW5nLm5ldApodXJnb2tiYXlyYWsuY29t +Ci5odXJyaXlldC5jb20udHIKLmh1dDIucnUKfHxodXRpYW55aS5uZXQKaHV0b25n +OS5uZXQKaHV5YW5kZXguY29tCi5od2FkemFuLnR3Cnx8aHdheXVlLm9yZy50dwp8 +fGh3aW5mby5jb20KfHxoeHdrLm9yZwpoeHdxLm9yZwp8fGh5cGVycmF0ZS5jb20K +ZWJvb2suaHlyZWFkLmNvbS50dwp8fGVib29rLmh5cmVhZC5jb20udHcKCiEtLS0t +LS0tLS0tLS0tLS0tLS0tLUlJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8fGkx +LmhrCnx8aTJwMi5kZQp8fGkycnVubmVyLmNvbQp8fGk4MThoay5jb20KLmktY2Fi +bGUuY29tCi5pLXBhcnQuY29tLnR3Ci5pYW10b3BvbmUuY29tCmlhc2suY2EKfHxp +YXNrLmNhCmlhc2suYnoKfHxpYXNrLmJ6Ci5pYXYxOS5jb20KaWJpYmxpby5vcmcv +cHViL3BhY2thZ2VzL2NjaWMKLmlibGlzdC5jb20KfHxpYmxvZ3NlcnYtZi5uZXQK +aWJyb3Mub3JnCnxodHRwOi8vY24uaWJ0aW1lcy5jb20KLmlidnBuLmNvbQp8fGli +dnBuLmNvbQppY2Ftcy5jb20KYmxvZ3MuaWNlcm9ja2V0LmNvbS90YWcKLmljaWou +b3JnCnx8aWNpai5vcmcKfHxpY2wtZmkub3JnCi5pY29jby5jb20KfHxpY29jby5j +b20KCiEtLTM4LjEwMy4xNjUuNTAKfHxmdXJiby5vcmcKIS0tfHxpY29uZmFjdG9y +eS5jb20KfHx3YXJibGVyLmljb25mYWN0b3J5Lm5ldAoKfHxpY29ucGFwZXIub3Jn +CiEtLSBHb29nbGUgUGFnZXMKfHxpY3UtcHJvamVjdC5vcmcKdy5pZGFpd2FuLmNv +bS9mb3J1bQp8fGlkZGRkZy5jb20KaWRlbW9jcmFjeS5hc2lhCi5pZGVudGkuY2EK +fHxpZGVudGkuY2EKfHxpZGlvbWNvbm5lY3Rpb24uY29tCnxodHRwOi8vd3d3Lmlk +bGNveW90ZS5jb20KLmlkb3VnYS5jb20KLmlkcmVhbXguY29tCmZvcnVtLmlkc2Ft +LmNvbQouaWR2LnR3Ci5pZWFzeTUuY29tCnxodHRwOi8vaWVhc3k1LmNvbQouaWVk +MmsubmV0Ci5pZW5lcmd5MS5jb20KfGh0dHA6Ly9pZi50dHQvCmlmYW5xaWFuZy5j +b20KLmlmY3NzLm9yZwp8fGlmY3NzLm9yZwppZmpjLm9yZwouaWZ0LnR0CnxodHRw +Oi8vaWZ0LnR0Cnx8aWZyZWV3YXJlcy5jb20KfHxpZ2NkLm5ldAouaWdmdy5uZXQK +fHxpZ2Z3Lm5ldAouaWdmdy50ZWNoCnx8aWdmdy50ZWNoCi5pZ21nLmRlCnx8aWdu +aXRlZGV0cm9pdC5uZXQKLmlnb3RtYWlsLmNvbS50dwp8fGlndml0YS5jb20KfHxp +aGFra2EubmV0Ci5paGFvLm9yZy9kejUKfHxpaWNucy5jb20KLmlrc3Rhci5jb20K +fHxpbGx1c2lvbmZhY3RvcnkuY29tCnx8aWxvdmU4MC5iZQp8fGltLnR2CkBAfHxt +eXZsb2cuaW0udHYKfHxpbTg4LnR3Ci5pbWdjaGlsaS5uZXQKfGh0dHA6Ly9pbWdj +aGlsaS5uZXQKLmltYWdlYWIuY29tCi5pbWFnZWZhcC5jb20KfHxpbWFnZWZhcC5j +b20KfHxpbWFnZWZsZWEuY29tCmltYWdlc2hhY2sudXMKfHxpbWFnZXZlbnVlLmNv +bQp8fGltYWdlemlsbGEubmV0Ci5pbWIub3JnCnxodHRwOi8vaW1iLm9yZwoKIS0t +SU1EQgp8aHR0cDovL3d3dy5pbWRiLmNvbS9uYW1lL25tMDQ4MjczMAouaW1kYi5j +b20vdGl0bGUvdHQwODE5MzU0Ci5pbWRiLmNvbS90aXRsZS90dDE1NDAwNjgKLmlt +ZGIuY29tL3RpdGxlL3R0NDkwODY0NAoKLmltZy5seQp8fGltZy5seQouaW1rZXYu +Y29tCnx8aW1rZXYuY29tCi5pbWxpdmUuY29tCi5pbW1vcmFsLmpwCmltcGFjdC5v +cmcuYXUKaW1wcC5tbgp8aHR0cDovL3RlY2gyLmluLmNvbS92aWRlby8KaW45OS5v +cmcKaW4tZGlzZ3Vpc2UuY29tCi5pbmNhcGRucy5uZXQKLmluY2xvYWsuY29tCnx8 +aW5jbG9hay5jb20KfHxpbmNyZWRpYm94LmZyCnx8aW5kaWFuZGVmZW5zZW5ld3Mu +aW4KdGltZXNvZmluZGlhLmluZGlhdGltZXMuY29tL2RhbGFpCnRpbWVzb2ZpbmRp +YS5pbmRpYXRpbWVzLmNvbS9kZWZhdWx0aW50ZXJzdGl0aWFsLmNtcwouaW5kaWVt +ZXJjaC5jb20KfHxpbmRpZW1lcmNoLmNvbQppbmZvLWdyYWYuZnIKd2Vic2l0ZS5p +bmZvcm1lci5jb20KLmluaXRpYXRpdmVzZm9yY2hpbmEub3JnCi5pbmt1aS5jb20K +LmlubWVkaWFoay5uZXQKfHxpbm1lZGlhaGsubmV0Cnx8aW5uZXJtb25nb2xpYS5v +cmcKfGh0dHA6Ly9ibG9nLmlub3JlYWRlci5jb20KLmlub3RlLnR3Ci5pbnNlY2Ft +Lm9yZwp8aHR0cDovL2luc2VjYW0ub3JnCnx8aW5zaWRldm9hLmNvbQouaW5zdGl0 +dXQtdGliZXRhaW4ub3JnCnxodHRwOi8vaW50ZXJuZXQub3JnLwppbnRlcm5ldGRl +ZmVuc2VsZWFndWUub3JnCmludGVybmV0ZnJlZWRvbS5vcmcKIS0tfHxpbnRlcnBv +bC5pbnQKfHxpbnRlcm5ldHBvcGN1bHR1cmUuY29tCmlueGlhbi5jb20KfHxpbnhp +YW4uY29tCmlwYWx0ZXIuY29tCiEtLXx8aXBjZi5vcmcudHcKLmlwZmlyZS5vcmcK +fHxpcGhvbmU0aG9uZ2tvbmcuY29tCnx8aXBob25laGFja3MuY29tCnx8aXBob25l +dGFpd2FuLm9yZwp8fGlwaG9uaXguZnIKfHxpcGljdHVyZS5ydQouaXBqZXRhYmxl +Lm5ldAp8fGlwamV0YWJsZS5uZXQKLmlwb2Jhci5jb20vcmVhZC5waHA/Cmlwb29j +ay5jb20vaW1nCi5pcG9ydGFsLm1lCnxodHRwOi8vaXBvcnRhbC5tZQp8fGlwcG90 +di5jb20KLmlwcmVkYXRvci5zZQp8fGlwcmVkYXRvci5zZQouaXB0di5jb20udHcK +fHxpcHR2YmluLmNvbQp8fGlwdmFuaXNoLmNvbQppcmVkbWFpbC5vcmcKY2hpbmVz +ZS5pcmliLmlyCnx8aXJvbmJpZ2Zvb2xzLmNvbXB5dGhvbi5uZXQKfHxpcm9ucHl0 +aG9uLm5ldAouaXJvbnNvY2tldC5jb20KfHxpcm9uc29ja2V0LmNvbQouaXMuZ2QK +LmlzbGFoaGFiZXIubmV0Ci5pc2xhbS5vcmcuaGsKfGh0dHA6Ly9pc2xhbS5vcmcu +aGsKLmlzbGFtYXdhcmVuZXNzLm5ldC9Bc2lhL0NoaW5hCi5pc2xhbWhvdXNlLmNv +bQp8fGlzbGFtaG91c2UuY29tCi5pc2xhbWljaXR5LmNvbQouaXNsYW1pY3BsdXJh +bGlzbS5vcmcKLmlzbGFtdG9kYXkubmV0Ci5pc2FhY21hby5jb20KfHxpc2FhY21h +by5jb20KfHxpc2dyZWF0Lm9yZwp8fGlzbWFlbGFuLmNvbQouaXNtYWxsdGl0cy5j +b20KfHxpc21wcm9mZXNzaW9uYWwubmV0Cmlzb2h1bnQuY29tCnx8aXNyYWJveC5j +b20KLmlzc3V1LmNvbQp8fGlzc3V1LmNvbQouaXN0YXJzLmNvLm56Cm92ZXJzZWEu +aXN0YXJzaGluZS5jb20KfHxvdmVyc2VhLmlzdGFyc2hpbmUuY29tCmJsb2cuaXN0 +ZWYuaW5mby8yMDA3LzEwLzIxL215ZW50dW5uZWwKLmlzdGlxbGFsaGV3ZXIuY29t +Ci5pc3RvY2twaG90by5jb20KaXN1bmFmZmFpcnMuY29tCmlzdW50di5jb20KaXRh +Ym9vLmluZm8KfHxpdGFib28uaW5mbwouaXRhbGlhdGliZXQub3JnCmRvd25sb2Fk +Lml0aG9tZS5jb20udHcKaXRoZWxwLml0aG9tZS5jb20udHcKfHxpdHNoaWRkZW4u +Y29tCi5pdHNreS5pdAouaXR3ZWV0Lm5ldAp8aHR0cDovL2l0d2VldC5uZXQKLml1 +NDUuY29tCi5pdWhyZGYub3JnCnx8aXVocmRmLm9yZwouaXVrc2t5LmNvbQouaXZh +Y3kuY29tCnx8aXZhY3kuY29tCi5pdmVyeWNkLmNvbQouaXZwbi5uZXQKIS0tfHxp +dnBuLm5ldAp8fGl4cXVpY2suY29tCi5peHh4LmNvbQppeW91cG9ydC5jb20KfHxp +eW91cG9ydC5jb20KLml6YW9iYW8udXMKfHxnbW96b21nLml6aWhvc3Qub3JnCi5p +emxlcy5uZXQKLml6bGVzZW0ub3JnCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1KSi0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfHxqLm1wCmJsb2cuamFja2ppYS5jb20K +amFtYWF0Lm9yZwouamFteWFuZ25vcmJ1LmNvbQp8aHR0cDovL2phbXlhbmdub3Ji +dS5jb20KLmphbmR5eC5jb20KfHxqYW53b25ncGhvdG8uY29tCnx8amFwYW4td2hv +cmVzLmNvbQouamF2LmNvbQouamF2MTAxLmNvbQouamF2MmJlLmNvbQp8fGphdjJi +ZS5jb20KLmphdjY4LnR2Ci5qYXZha2liYS5vcmcKfGh0dHA6Ly9qYXZha2liYS5v +cmcKLmphdmJ1cy5jb20KfHxqYXZidXMuY29tCnx8amF2Zm9yLm1lCi5qYXZoZC5j +b20KLmphdmhpcC5jb20KLmphdm1vYmlsZS5uZXQKfGh0dHA6Ly9qYXZtb2JpbGUu +bmV0Ci5qYXZtb28uY29tCi5qYXZzZWVuLmNvbQp8aHR0cDovL2phdnNlZW4uY29t +CmpidGFsa3MuY2MKamJ0YWxrcy5jb20KamJ0YWxrcy5teQouamR3c3kuY29tCmpl +YW55aW0uY29tCnx8amZxdTM2LmNsdWIKfHxqZnF1MzcueHl6Cnx8amdvb2RpZXMu +Y29tCi5qaWFuZ3dlaXBpbmcuY29tCnx8amlhbmd3ZWlwaW5nLmNvbQp8fGppYW95 +b3U4LmNvbQouamllaHVhLmN6Cnx8aGsuamllcGFuZy5jb20KfHx0dy5qaWVwYW5n +LmNvbQpqaWVzaGliYW9iYW8uY29tCi5qaWdnbGVnaWZzLmNvbQo1NmN1bjA0Lmpp +Z3N5LmNvbQpqaWdvbmcxMDI0LmNvbQpkYW9kdTE0LmppZ3N5LmNvbQpzcGVjeGlu +emwuamlnc3kuY29tCndsY25ldy5qaWdzeS5jb20KLmppaGFkb2xvZ3kubmV0Cnxo +dHRwOi8vamloYWRvbG9neS5uZXQKamluYnVzaGUub3JnCnx8amluYnVzaGUub3Jn +Ci5qaW5nc2ltLm9yZwp6aGFvLmppbmhhaS5kZQpqaW5ncGluLm9yZwp8fGppbmdw +aW4ub3JnCmppbnBpYW53YW5nLmNvbQouamlucm91a29uZy5jb20KYWMuamlydWFu +Lm5ldAp8fGppdG91Y2guY29tCi5qaXp6dGhpcy5jb20KampnaXJscy5jb20KLmpr +Yi5jYwp8aHR0cDovL2prYi5jYwpqa2ZvcnVtLm5ldAp8fGptYS5nby5qcApyZXNl +YXJjaC5qbXNjLmhrdS5oay9zb2NpYWwKd2VpYm9zY29wZS5qbXNjLmhrdS5oawou +am1zY3VsdC5jb20KfGh0dHA6Ly9qbXNjdWx0LmNvbQp8fGpvYWNoaW1zLm9yZwp8 +fGpvYnNvLnR2Ci5zdW53aW5pc20uam9pbmJicy5uZXQKLmpvdXJuYWxjaHJldGll +bi5uZXQKfHxqb3VybmFsb2ZkZW1vY3JhY3kub3JnCi5qb3ltaWlodWIuY29tCi5q +b3lvdXJzZWxmLmNvbQpqcG9wZm9ydW0ubmV0Ci5qdWJ1c2hvdXNoZW4uY29tCnx8 +anVidXNob3VzaGVuLmNvbQohLS1Eb2FtaW4gcGFya2luZwouanVodWFyZW4uY29t +Cnx8anVsaWVyZXljLmNvbQp8fGp1bmF1emEuY29tCi5qdW5lNGNvbW1lbW9yYXRp +b24ub3JnCi5qdW5lZm91cnRoLTIwLm5ldAp8fGp1bmVmb3VydGgtMjAubmV0Cnx8 +YmJzLmp1bmdsb2JhbC5uZXQKLmp1b2FhLmNvbQp8aHR0cDovL2p1b2FhLmNvbQpq +dXN0ZnJlZXZwbi5jb20KLmp1c3RpY2Vmb3J0ZW56aW4ub3JnCmp1c3RwYXN0ZS5p +dApqdXN0dHJpc3Rhbi5jb20KanV5dWFuZ2Uub3JnCmp1eml5dWUuY29tCnx8anV6 +aXl1ZS5jb20KfHxqd211c2ljLm9yZwpAQHx8bXVzaWMuandtdXNpYy5vcmcKLmp5 +eGYubmV0CgohLS0tLS0tLS0tLS0tLS0tLS0tLS1LSy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0KfHxrLWRvdWppbi5uZXQKfHxrYS13YWkuY29tCi5rYWd5dS5vcmcK +fHxrYWd5dS5vcmcuemEKLmthZ3l1bW9ubGFtLm9yZwoua2FneXVuZXdzLmNvbS5o +awoua2FneXVvZmZpY2Uub3JnCnx8a2FneXVvZmZpY2Uub3JnCnx8a2FneXVvZmZp +Y2Uub3JnLnR3Ci5rYWl5dWFuLmRlCi5rYWthby5jb20KfHxrYWthby5jb20KLmth +bGFjaGFrcmFsdWdhbm8ub3JnCi5rYW5rYW4udG9kYXkKLmthbm5ld3lvcmsuY29t +Cnx8a2FubmV3eW9yay5jb20KLmthbnNoaWZhbmcuY29tCnx8a2Fuc2hpZmFuZy5j +b20KfHxrYW50aWUub3JnCmthbnpob25nZ3VvLmNvbQprYW56aG9uZ2d1by5ldQou +a2FvdGljLmNvbQp8fGthcmF5b3UuY29tCmthcmtodW5nLmNvbQoua2FybWFwYS5v +cmcKLmthcm1hcGEtdGVhY2hpbmdzLm9yZwoua2JhLXR4Lm9yZwoua2Nvb2xvbmxp +bmUuY29tCi5rZWJydW0uY29tCnx8a2VicnVtLmNvbQoua2VjaGFyYS5jb20KLmtl +ZXBhbmRzaGFyZS5jb20vdmlzaXQvdmlzaXRfcGFnZS5waHA/aT02ODgxNTQKIS0t +fHxrZWVwdmlkLmNvbQoua2Vlem1vdmllcy5jb20KLmtlbmRpbmNvcy5uZXQKLmtl +bmVuZ2JhLmNvbQp8fGtlbmVuZ2JhLmNvbQp8fGtlb250ZWNoLm5ldAoua2VwYXJk +LmNvbQp8fGtlcGFyZC5jb20Kd2lraS5rZXNvLmNuL0hvbWUKfHxrZXljZG4uY29t +Ci5raGFiZGhhLm9yZwoua2htdXNpYy5jb20udHcKfHxraWNoaWt1LWRvdWppbmtv +LmNvbQoua2lrLmNvbQp8fGtpay5jb20KYmJzLmtpbXkuY29tLnR3Ci5raW5kbGVy +ZW4uY29tCnxodHRwOi8va2luZGxlcmVuLmNvbQp8aHR0cDovL3d3dy5raW5kbGVy +ZW4uY29tCi5raW5nZG9tc2FsdmF0aW9uLm9yZwp8fGtpbmdkb21zYWx2YXRpb24u +b3JnCmtpbmdob3N0LmNvbQohLS0ua2luZ3N0b25lLmNvbS50dy9ib29rLwp8fGtp +bmdzdG9uZS5jb20udHcKLmtpbmsuY29tCmtpbGx3YWxsLmNvbQp8fGtpbGx3YWxs +LmNvbQp8fGtpbm1lbi50cmF2ZWwKLmtpci5qcAoua2lzc2JiYW8uY24KfGh0dHA6 +Ly9raXdpLmt6Cnx8a2std2h5cy5jby5qcAohLS18fGttdC5vcmcudHcKLmttdWgu +b3JnLnR3Ci5rbm93bGVkZ2VydXNoLmNvbS9rci9lbmN5Y2xvcGVkaWEKLmtvYm8u +Y29tCnx8a29iby5jb20KLmtvYm9ib29rcy5jb20KfHxrb2JvYm9va3MuY29tCnx8 +a29kaW5nZW4uY29tCkBAfHx3d3cua29kaW5nZW4uY29tCnx8a29tcG96ZXIubmV0 +Ci5rb25hY2hhbi5jb20KfGh0dHA6Ly9rb25hY2hhbi5jb20KLmtvbmUuY29tCnx8 +a29vbHNvbHV0aW9ucy5jb20KLmtvb3Juay5jb20KfHxrb29ybmsuY29tCnx8a29y +YW5tYW5kYXJpbi5jb20KLmtvcmVuYW4yLmNvbQp8aHR0cDovL2dvamV0LmtydGNv +LmNvbS50dwoua3NkbC5vcmcKLmtzbmV3cy5jb20udHcKfHxrdHpoay5jb20KLmt1 +aS5uYW1lL2V2ZW50Cmt1bi5pbQoua3VyYXNoc3VsdGFuLmNvbQp8fGt1cnRtdW5n +ZXIuY29tCmt1c29jaXR5LmNvbQp8fGt3Y2cuY2EKa3dvbmd3YWguY29tLm15Ci5r +eHN3LmxpZmUKfHxreHN3LmxpZmUKLmt5b2Z1bi5jb20Ka3lvaGsubmV0Cnx8a3lv +eXVlLmNvbQoua3l6eWhlbGxvLmNvbQp8fGt5enloZWxsby5jb20KLmt6ZW5nLmlu +Zm8KfHxremVuZy5pbmZvCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1MTC0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0KbGEtZm9ydW0ub3JnCmxhZGJyb2tlcy5jb20KfHxs +YWJpZW5uYWxlLm9yZwoubGFncmFuZXBvY2EuY29tCnx8bGFncmFuZXBvY2EuY29t +Ci5sYWx1bGFsdS5jb20KLmxhbWEuY29tLnR3Cnx8bGFtYS5jb20udHcKLmxhbWF5 +ZXNoZS5jb20KfGh0dHA6Ly9sYW1heWVzaGUuY29tCnxodHRwOi8vd3d3LmxhbWVu +aHUuY29tCi5sYW1uaWEuY28udWsKfHxsYW1uaWEuY28udWsKbGFtcmltLmNvbQou +bGFudGVybmNuLmNuCnxodHRwOi8vbGFudGVybmNuLmNuCi5sYW50b3Nmb3VuZGF0 +aW9uLm9yZwoubGFvZC5jbgp8aHR0cDovL2xhb2QuY24KbGFvZ2FpLm9yZwp8fGxh +b2dhaS5vcmcKbGFvbWl1LmNvbQoubGFveWFuZy5pbmZvCnxodHRwOi8vbGFveWFu +Zy5pbmZvCnx8bGFwdG9wbG9ja2Rvd24uY29tCi5sYXFpbmdkYW4ubmV0Cnx8bGFx +aW5nZGFuLm5ldAp8fGxhcnNnZW9yZ2UuY29tCi5sYXN0Y29tYmF0LmNvbQp8aHR0 +cDovL2xhc3Rjb21iYXQuY29tCnx8bGFzdGZtLmVzCmxhdGVsaW5lbmV3cy5jb20K +LmxhdGliZXQub3JnCnx8bGUtdnBuLmNvbQoubGVhZnl2cG4ubmV0Cnx8bGVhZnl2 +cG4ubmV0CmxlZWFvLmNvbS5jbi9iYnMvZm9ydW0ucGhwCiEtLXx8bGVlY2hldWt5 +YW4ub3JnCmxlZm9yYS5jb20KfHxsZWZ0MjEuaGsKLmxlZ2FscG9ybm8uY29tCi5s +ZWdzamFwYW4uY29tCnxodHRwOi8vbGVpcmVudHYuY2EKbGVpc3VyZWNhZmUuY2EK +fHxsZW1hdGluLmNoCi5sZW1vbmRlLmZyCnx8bGVud2hpdGUuY29tCmxlcm9zdWEu +b3JnCnx8bGVyb3N1YS5vcmcKYmxvZy5sZXN0ZXI4NTAuaW5mbwp8fGxlc29pci5i +ZQoubGV0b3UuY29tCmxldHNjb3JwLm5ldAp8fGxldHNjb3JwLm5ldAp8fHNzLmxl +dnloc3UuY29tCiE2OS4xNi4xNzUuNDIKfHxjZG4uYXNzZXRzLmxmcGNvbnRlbnQu +Y29tCi5saGFrYXIub3JnCnxodHRwOi8vbGhha2FyLm9yZwoubGhhc29jaWFsd29y +ay5vcmcKLmxpYW5neW91Lm5ldAp8fGxpYW5neW91Lm5ldAoubGlhbnl1ZS5uZXQK +fHxsaWFvd2FuZ3hpemFuZy5uZXQKLmxpYW93YW5neGl6YW5nLm5ldAp8fGxpYmVy +YWwub3JnLmhrCi5saWJlcnR5dGltZXMuY29tLnR3CmJsb2dzLmxpYnJhcnlpbmZv +cm1hdGlvbnRlY2hub2xvZ3kuY29tL2p4eXoKLmxpZGVjaGVuZy5jb20vYmxvZy9m +dWNraW5nLWdmdwoubGlnaHRlbi5vcmcudHcKLmxpZ2h0bm92ZWwuY24KQEB8aHR0 +cHM6Ly93d3cubGlnaHRub3ZlbC5jbgpsaW1pYW8ubmV0Cmxpbmt1c3dlbGwuY29t +CmFiaXRuby5saW5waWUuY29tL3VzZS1pcHY2LXRvLWZ1Y2stZ2Z3Cnx8bGluZS5t +ZQp8fGxpbmUtYXBwcy5jb20KLmxpbmdsaW5nZmEuY29tCnx8bGluZ3ZvZGljcy5j +b20KLmxpbmstby1yYW1hLmNvbQp8aHR0cDovL2xpbmstby1yYW1hLmNvbQoubGlu +a2lkZW8uY29tCnx8YXBpLmxpbmtzYWxwaGEuY29tCnx8YXBpZG9jcy5saW5rc2Fs +cGhhLmNvbQp8fHd3dy5saW5rc2FscGhhLmNvbQp8fGhlbHAubGlua3NhbHBoYS5j +b20KfHxsaW51eC5vcmcuaGsKbGludXh0b3kub3JnL2FyY2hpdmVzL2luc3RhbGxp +bmctd2VzdC1jaGFtYmVyLW9uLXVidW50dQoubGlvbnNyb2FyLmNvbQoubGlwdW1h +bi5jb20KfHxsaXF1aWR2cG4uY29tCnx8Z3JlYXRmaXJlLnVzNy5saXN0LW1hbmFn +ZS5jb20KfHxsaXN0ZW50b3lvdXR1YmUuY29tCmxpc3RvcmlvdXMuY29tCnx8bGl1 +ZGVqdW4uY29tCi5saXVoYW55dS5jb20KLmxpdWppYW5zaHUuY29tCnx8bGl1amlh +bnNodS5jb20KLmxpdXhpYW9iby5uZXQKfGh0dHA6Ly9saXV4aWFvYm8ubmV0Cmxp +dXhpYW90b25nLmNvbQp8fGxpdXhpYW90b25nLmNvbQoubGl2ZWRvb3IuanAKLmxp +dmVsZWFrLmNvbQp8fGxpdmVsZWFrLmNvbQoubGl2ZXN0YXRpb24uY29tCmxpdmVz +dHJlYW0uY29tCnx8bGl2ZXN0cmVhbS5jb20KfHxsaXZpbmdvbmxpbmUudXMKfHxs +aXZpbmdzdHJlYW0uY29tCnx8bGl2ZXZpZGVvLmNvbQoubGl2ZXZpZGVvLmNvbQou +bGl3YW5neWFuZy5jb20KbGl6aGl6aHVhbmdiaS5jb20KbGtjbi5uZXQKLmxsc3Mu +bWUvCi5sb2FkLnRvCi5sb2JzYW5nd2FuZ3lhbC5jb20KLmxvY2FsZG9tYWluLndz +Cnx8bG9jYWxkb21haW4ud3MKbG9jYWxwcmVzc2hrLmNvbQp8fGxvY2tlc3Rlay5j +b20KbG9nYm90Lm5ldAp8fGxvZ2lxeC5jb20Kc2VjdXJlLmxvZ21laW4uY29tCnx8 +c2VjdXJlLmxvZ21laW4uY29tCi5sb25kb25jaGluZXNlLmNhCi5sb25naGFpci5o +awpsb25nbXVzaWMuY29tCnx8bG9uZ3Rlcm1seS5uZXQKfHxsb29rcGljLmNvbQou +bG9va3Rvcm9udG8uY29tCnxodHRwOi8vbG9va3Rvcm9udG8uY29tCi5sb3RzYXdh +aG91c2Uub3JnL3RpYmV0YW4tbWFzdGVycy9mb3VydGVlbnRoLWRhbGFpLWxhbWEK +LmxvdHVzbGlnaHQub3JnLmhrCi5sb3R1c2xpZ2h0Lm9yZy50dwpoa3JlcG9ydGVy +LmxvdmVkLmhrCiEtLTQwMz8KfHxscHNnLmNvbQp8fGxyZnouY29tCi5scmlwLm9y +Zwp8fGxyaXAub3JnCi5sc2Qub3JnLmhrCnx8bHNkLm9yZy5oawpsc2ZvcnVtLm5l +dAoubHNtLm9yZwp8fGxzbS5vcmcKLmxzbWNoaW5lc2Uub3JnCnx8bHNtY2hpbmVz +ZS5vcmcKLmxzbWtvcmVhbi5vcmcKfHxsc21rb3JlYW4ub3JnCi5sc21yYWRpby5j +b20vcmFkX2FyY2hpdmVzCi5sc213ZWJjYXN0LmNvbQoubHRuLmNvbS50dwp8aHR0 +cDovL2x0bi5jb20udHcKLmx1a2U1NC5jb20KLmx1a2U1NC5vcmcKLmx1cG0ub3Jn +Cnx8bHVwbS5vcmcKfHxsdXNoc3Rvcmllcy5jb20KbHV4ZWJjLmNvbQpsdmhhaS5v +cmcKfHxsdmhhaS5vcmcKfHxsdnYyLmNvbQoubHlmaGsubmV0CnxodHRwOi8vbHlm +aGsubmV0Ci5sem10bmV3cy5vcmcKfHxsem10bmV3cy5vcmcKCiEtLS0tLS0tLS0t +LS0tLS0tLS0tLU1NLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpodHRwOi8vKi5t +LXRlYW0uY2MKIS0tbS10ZWFtLmNjL2ZvcnVtCi5tYWNyb3Zwbi5jb20KbWFjdHMu +Y29tLnR3Cnx8bWFkLWFyLmNoCnx8bWFkdGh1bWJzLmNvbQp8fG1hZ2ljLW5ldC5p +bmZvCm1haGFib2RoaS5vcmcKbXkubWFpbC5ydQoubWFpcGx1cy5jb20KfGh0dHA6 +Ly9tYWlwbHVzLmNvbQoubWFpemhvbmcub3JnCm1ha2thaG5ld3NwYXBlci5jb20K +Lm1hbWluZ3poZS5jb20KbWFuaWN1cjRpay5ydQoubWFwbGV3LmNvbQp8aHR0cDov +L21hcGxldy5jb20KfHxtYXJjLmluZm8KbWFyZ3Vlcml0ZS5zdQp8fG1hcnRpbmNh +cnRvb25zLmNvbQptYXNrZWRpcC5jb20KLm1haWlvLm5ldAptYWlsLWFyY2hpdmUu +Y29tCi5tYWxheXNpYWtpbmkuY29tCnx8bWFrZW15bW9vZC5jb20KLm1hbmNodWt1 +by5uZXQKLm1hbmlhc2guY29tCnxodHRwOi8vbWFuaWFzaC5jb20KLm1hbnNpb24u +Y29tCi5tYW5zaW9ucG9rZXIuY29tCiEtLXx8bWFyaW5lcy5taWwKIS0tbWFya21h +aWwub3JnKm1lc3NhZ2UKfHxtYXJ0YXUuY29tCnxodHRwOi8vYmxvZy5tYXJ0aW5v +ZWkuY29tCi5tYXJ0c2FuZ2thZ3l1b2ZmaWNpYWwub3JnCnxodHRwOi8vbWFydHNh +bmdrYWd5dW9mZmljaWFsLm9yZwptYXJ1dGEuYmUvZm9yZ2V0Ci5tYXJ4aXN0LmNv +bQp8fG1hcnhpc3QubmV0Ci5tYXJ4aXN0cy5vcmcvY2hpbmVzZQohLS18fG1hc2hh +YmxlLmNvbQp8fG1hdGFpbmphLmNvbQp8fG1hdGhhYmxlLmlvCnx8bWF0aGlldy1i +YWRpbW9uLmNvbQp8fG1hdHN1c2hpbWFrYWVkZS5jb20KfGh0dHA6Ly9tYXR1cmVq +cC5jb20KbWF5aW1heWkuY29tCi5tYXhpbmcuanAKLm1jYWYuZWUKfGh0dHA6Ly9t +Y2FmLmVlCnx8bWNhZGZvcnVtcy5jb20KbWNmb2cuY29tCm1jcmVhc2l0ZS5jb20K +Lm1kLXQub3JnCnx8bWQtdC5vcmcKfHxtZWFuc3lzLmNvbQoubWVkaWEub3JnLmhr +Ci5tZWRpYWNoaW5lc2UuY29tCnx8bWVkaWFjaGluZXNlLmNvbQoubWVkaWFmaXJl +LmNvbS8/Ci5tZWRpYWZpcmUuY29tL2Rvd25sb2FkCi5tZWRpYWZyZWFrY2l0eS5j +b20KfHxtZWRpYWZyZWFrY2l0eS5jb20KLm1lZGl1bS5jb20KfHxtZWRpdW0uY29t +Ci5tZWV0YXYuY29tCnx8bWVldHVwLmNvbQptZWZlZWRpYS5jb20KamloYWRpbnRl +bC5tZWZvcnVtLm9yZwp8fG1lZ2EubnoKfHxtZWdhcHJveHkuY29tCnx8bWVnYXJv +dGljLmNvbQptZWdhdmlkZW8uY29tCnx8bWVndXJpbmVsdWthLmNvbQptZWlyaXhp +YW9jaGFvLmNvbQp8fG1lbG9uLXBlYWNoLmNvbQoubWVsdG9kYXkuY29tCi5tZW1l +aGsuY29tCnx8bWVtZWhrLmNvbQptZW1vcnliYnMuY29tCi5tZW1yaS5vcmcKLm1l +bXJpanR0bS5vcmcKLm1lcmN5cHJvcGhldC5vcmcKfGh0dHA6Ly9tZXJjeXByb3Bo +ZXQub3JnCi5tZXJpZGlhbi10cnVzdC5vcmcKfGh0dHA6Ly9tZXJpZGlhbi10cnVz +dC5vcmcKLm1lcmlwZXQuYml6CnxodHRwOi8vbWVyaXBldC5iaXoKLm1lcmlwZXQu +Y29tCnxodHRwOi8vbWVyaXBldC5jb20KbWVyaXQtdGltZXMuY29tLnR3Cm1lc2hy +ZXAuY29tCi5tZXNvdHcuY29tL2JicwptZXRhY2FmZS5jb20vd2F0Y2gKfHxtZXRl +b3JzaG93ZXJzb25saW5lLmNvbQp8aHR0cDovL3d3dy5tZXRyby50YWlwZWkvCi5t +ZXRyb2hrLmNvbS5oay8/Y21kPWRldGFpbCZjYXRlZ29yeUlEPTIKfHxtZXRyb2xp +ZmUuY2EKLm1ldHJvcmFkaW8uY29tLmhrCnxodHRwOi8vbWV0cm9yYWRpby5jb20u +aGsKbWV5b3UuanAKLm1leXVsLmNvbQp8fG1nb29uLmNvbQp8fG1nc3RhZ2UuY29t +Cnx8bWg0dS5vcmcKbWhyYWRpby5vcmcKfGh0dHA6Ly9taWNoYWVsYW50aS5jb20K +fHxtaWNoYWVsbWFya2V0bC5jb20KLm1pY3JvdnBuLmNvbQp8aHR0cDovL21pY3Jv +dnBuLmNvbQptaWRkbGUtd2F5Lm5ldAoubWloay5oay9mb3J1bQoubWloci5jb20K +bWlodWEub3JnCiEtLUlQCnx8bWlrZXNvbHR5cy5jb20KLm1pbHBoLm5ldAp8aHR0 +cDovL21pbHBoLm5ldAoubWlsc3VycHMuY29tCm1pbWlhaS5uZXQKLm1pbWl2aXAu +Y29tCi5taW1pdnYuY29tCi5taW5kcm9sbGluZy5vcmcKfGh0dHA6Ly9taW5kcm9s +bGluZy5vcmcKLm1pbmdodWkub3Iua3IKfGh0dHA6Ly9taW5naHVpLm9yLmtyCm1p +bmdodWkub3JnCnx8bWluZ2h1aS5vcmcKbWluZ2h1aS1hLm9yZwptaW5naHVpLWIu +b3JnCm1pbmdodWktc2Nob29sLm9yZwoubWluZ2ppbmdsaXNoaS5jb20KfHxtaW5n +amluZ2xpc2hpLmNvbQptaW5namluZ25ld3MuY29tCnx8bWluZ2ppbmd0aW1lcy5j +b20KLm1pbmdwYW8uY29tCnx8bWluZ3Bhby5jb20KLm1pbmdwYW9jYW5hZGEuY29t +Ci5taW5ncGFvbW9udGhseS5jb20KfGh0dHA6Ly9taW5ncGFvbW9udGhseS5jb20K +bWluZ3Bhb25ld3MuY29tCi5taW5ncGFvbnkuY29tCi5taW5ncGFvc2YuY29tCi5t +aW5ncGFvdG9yLmNvbQoubWluZ3Bhb3Zhbi5jb20KLm1pbmdzaGVuZ2Jhby5jb20K +Lm1pbmhodWUubmV0Ci5taW5pZm9ydW0ub3JnCi5taW5pc3RyeWJvb2tzLm9yZwou +bWluemh1aHVhLm5ldAp8fG1pbnpodWh1YS5uZXQKbWluemh1emhhbnhpYW4uY29t +Cm1pbnpodXpob25nZ3VvLm9yZwp8fG1pcm9ndWlkZS5jb20KbWlycm9yYm9va3Mu +Y29tCi5taXN0LnZpcAp0aGVjZW50ZXIubWl0LmVkdQoubWl0YW8uY29tLnR3Ci5t +aXRiYnMuY29tCnx8bWl0YmJzLmNvbQptaXRiYnNhdS5jb20KLm1peGVyby5jb20K +fHxtaXhlcm8uY29tCm1peHBvZC5jb20KLm1peHguY29tCnx8bWl4eC5jb20KfHxt +aXp6bW9uYS5jb20KLm1rNTAwMC5jb20KLm1sY29vbC5jb20KLm1tLWNnLmNvbQp8 +fG1tYWF4eC5jb20KLm1tbWNhLmNvbQptbmV3c3R2LmNvbQp8fG1vYmF0ZWsubmV0 +Ci5tb2JpbGUwMS5jb20KfGh0dHA6Ly9tb2JpbGUwMS5jb20KfHxtb2JpbGV3YXlz +LmRlCi5tb2J5cGljdHVyZS5jb20KfGh0dHA6Ly9tb2J5LnRvCnx8bW9lZXJvbGli +cmFyeS5jb20Kd2lraS5tb2VnaXJsLm9yZwoubW9mYXhpZWh1aS5jb20KLm1vZm9z +LmNvbQp8fG1vZy5jb20KbW9saWh1YS5vcmcKfHxtb25kZXgub3JnCi5tb25leS1s +aW5rLmNvbS50dwp8aHR0cDovL21vbmV5LWxpbmsuY29tLnR3CnxodHRwOi8vd3d3 +Lm1vbmxhbWl0Lm9yZwoubW9vbmJicy5jb20KfHxtb29uYmJzLmNvbQpjMTUyMi5t +b29vLmNvbQp8fG1vbml0b3JjaGluYS5vcmcKYmJzLm1vcmJlbGwuY29tCnx8bW9y +bmluZ3N1bi5vcmcKfHxtb3JvbmV0YS5jb20KLm1vdGhlcmxlc3MuY29tCnxodHRw +Oi8vbW90aGVybGVzcy5jb20KbW90b3I0aWsucnUKLm1vdXNlYnJlYWtlci5jb20K +IS0tfHxtb3ZhYmxldHlwZS5jb20KLm1vdmVtZW50cy5vcmcKfHxtb3ZlbWVudHMu +b3JnCnx8bW92aWVmYXAuY29tCnx8d3d3Lm1venR3Lm9yZwoubXAzYnVzY2Fkb3Iu +Y29tCm1wM3llLmV1Cnx8bXBldHRpcy5jb20KbXBmaW5hbmNlLmNvbQptcGluZXdz +LmNvbQptcG9ubGluZS5oawoubXF4ZC5vcmcKfGh0dHA6Ly9tcXhkLm9yZwptcnR3 +ZWV0LmNvbQp8fG1ydHdlZXQuY29tCm5ld3MuaGsubXNuLmNvbQpuZXdzLm1zbi5j +b20udHcKbXNndWFuY2hhLmNvbQoubXN3ZTEub3JnCnxodHRwOi8vbXN3ZTEub3Jn +Cnx8bXRocnVmLmNvbQptdWNob3N1Y2tvLmNvbQp8fG11bHRpcGx5LmNvbQptdWx0 +aXByb3h5Lm9yZwptdWx0aXVwbG9hZC5jb20KLm11bGx2YWQubmV0Cnx8bXVsbHZh +ZC5uZXQKLm11bW15c2dvbGQuY29tCi5tdXJtdXIudHcKfGh0dHA6Ly9tdXJtdXIu +dHcKLm11c2ljYWRlLm5ldAoubXVzbGltdmlkZW8uY29tCnx8bXV6aS5jb20KfHxt +dXppLm5ldAp8fG14OTgxLmNvbQoubXktZm9ybW9zYS5jb20KLm15LXByb3h5LmNv +bQoubXktcHJpdmF0ZS1uZXR3b3JrLmNvLnVrCnx8bXktcHJpdmF0ZS1uZXR3b3Jr +LmNvLnVrCmZvcnVtLm15OTAzLmNvbQoubXlhY3RpbWVzLmNvbS9hY3RpbWVzCnx8 +bXlhbm5pdS5jb20KLm15YXVkaW9jYXN0LmNvbQp8fG15YXVkaW9jYXN0LmNvbQou +bXlhdi5jb20udHcvYmJzCi5teWJicy51cwoubXljYTE2OC5jb20KLm15Y2FuYWRh +bm93LmNvbQp8fGJicy5teWNoYXQudG8KfHxteWNoaW5hbXlob21lLmNvbQoubXlj +aGluYW15aG9tZS5jb20KLm15Y2hpbmFuZXQuY29tCi5teWNoaW5hbmV3cy5jb20K +fHxteWNoaW5hbmV3cy5jb20KLm15Y2hpbmVzZS5uZXdzCnx8bXljbm5ld3MuY29t +Cnx8bXlrb21pY2Eub3JnCm15Y291bGQuY29tL2Rpc2N1egoubXllYXN5dHYuY29t +Cnx8bXllY2xpcHNlaWRlLmNvbQoubXlmb3J1bS5jb20uaGsKfHxteWZvcnVtLmNv +bS5oawp8fG15Zm9ydW0uY29tLnVrCi5teWZyZWVjYW1zLmNvbQoubXlmcmVlcGF5 +c2l0ZS5jb20KLm15ZnJlc2huZXQuY29tCi5teWlwaGlkZS5jb20KfHxteWlwaGlk +ZS5jb20KZm9ydW0ubXltYWppLmNvbQpteW1lZGlhcm9tLmNvbS9maWxlcy9ib3gK +fHxteW1vZS5tb2UKfHxteW11c2ljLm5ldC50dwp8fG15cGFyYWdsaWRpbmcuY29t +Cnx8bXlwb3Blc2N1LmNvbQpteXJhZGlvLmhrL3BvZGNhc3QKLm15cmVhZGluZ21h +bmdhLmluZm8KbXlzaW5hYmxvZy5jb20KLm15c3BhY2UuY29tCiEtLS5ibG9ncy5t +eXNwYWNlLmNvbQohLS18fGJsb2dzLm15c3BhY2UuY29tCiEtLXZpZHMubXlzcGFj +ZS5jb20vaW5kZXguY2ZtP2Z1c2VhY3Rpb249dmlkcy4KIS0tdmlld21vcmVwaWNz +Lm15c3BhY2UuY29tCnx8bXlzcGFjZWNkbi5jb20KLm15dGFsa2JveC5jb20KLm15 +dGl6aS5jb20KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLU5OLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQp8fG5hYWNvYWxpdGlvbi5vcmcKb2xkLm5hYmJsZS5jb20KfHxu +YWl0aWsubmV0Ci5uYWt1ei5jb20vYmJzCnx8bmFsYW5kYWJvZGhpLm9yZwp8fG5h +bGFuZGF3ZXN0Lm9yZwoubmFtZ3lhbC5vcmcKbmFtZ3lhbG1vbmFzdGVyeS5vcmcK +fHxuYW1zaXNpLmNvbQoubmFueWFuZy5jb20KfHxuYW55YW5nLmNvbQoubmFueWFu +Z3Bvc3QuY29tCnx8bmFueWFuZ3Bvc3QuY29tCi5uYW56YW8uY29tCiEtLS5uYW56 +YW8uY29tL3NjL2NoaW5hLzIwMjIzCiEtLS5uYW56YW8uY29tL3NjL2hrLW1hY2F1 +LXR3Cnx8anBsLm5hc2EuZ292Cnx8cGRzLm5hc2EuZ292Cnx8c29sYXJzeXN0ZW0u +bmFzYS5nb3YKLm5ha2lkby5jb20KfHxuYWtpZG8uY29tCi5uYW9sLmNhCi5uYW9s +LmNjCnVpZ2h1ci5uYXJvZC5ydQoubmF0Lm1vZQp8fG5hdC5tb2UKY3liZXJnaG9z +dC5uYXRhZG8uY29tCnx8bmF0aW9uYWwtbG90dGVyeS5jby51awpuZXdzLm5hdGlv +bmFsZ2VvZ3JhcGhpYy5jb20vbmV3cy8yMDE0LzA2LzE0MDYwMy10aWFuYW5tZW4t +c3F1YXJlCi5uYXRpb25zb25saW5lLm9yZy9vbmV3b3JsZC90aWJldAp8fGxpbmUu +bmF2ZXIuanAKfHxuYXZ5ZmFtaWx5Lm5hdnkubWlsCnx8bmF2eXJlc2VydmUubmF2 +eS5taWwKfHxua28ubmF2eS5taWwKfHx1c25vLm5hdnkubWlsCm5hd2Vla2x5dGlt +ZXMuY29tCi5uYnR2cG4uY29tCnxodHRwOi8vbmJ0dnBuLmNvbQpuY2N3YXRjaC5v +cmcudHcKLm5jaC5jb20udHcKLm5jbi5vcmcKfHxuY24ub3JnCnx8ZXRvb2xzLm5j +b2wuY29tCi5uZGUuZGUKLm5kci5kZQoubmVkLm9yZwp8fG5la29zbG92YWtpYS5u +ZXQKfHxuZXB1c29rdS5jb20KfHxuZXQtZml0cy5wcm8KIS0tYmJzbmV3Lm5ldGJp +Zy5jb20KYmJzLm5ldGJpZy5jb20KLm5ldGJpcmRzLmNvbQpuZXRjb2xvbnkuY29t +CmJvbGluLm5ldGZpcm1zLmNvbQp8fG5ldG1lLmNjCm5ldHNuZWFrLmNvbQoubmV0 +d29yazU0LmNvbQpuZXR3b3JrZWRibG9ncy5jb20KLm5ldHdvcmt0dW5uZWwubmV0 +Cm5ldmVyZm9yZ2V0ODk2NC5vcmcKbmV3LTNsdW5jaC5uZXQKLm5ldy1ha2liYS5j +b20KLm5ldzk2LmNhCi5uZXdjZW50dXJ5bWMuY29tCnxodHRwOi8vbmV3Y2VudHVy +eW1jLmNvbQpuZXdjZW50dXJ5bmV3cy5jb20KfHxuZXdjaGVuLmNvbQoubmV3Y2hl +bi5jb20KLm5ld2dyb3VuZHMuY29tCm5ld2lwbm93LmNvbQoubmV3bGFuZG1hZ2F6 +aW5lLmNvbS5hdQoubmV3bmV3cy5jYQpuZXdzMTAwLmNvbS50dwpuZXdzY2hpbmFj +b21tZW50Lm9yZwoubmV3c2NuLm9yZwp8fG5ld3Njbi5vcmcKbmV3c3BlYWsuY2Mv +c3RvcnkKLm5ld3NhbmNhaS5jb20KfHxuZXdzYW5jYWkuY29tCi5uZXdzZGV0b3gu +Y2EKLm5ld3NkaC5jb20KfHxuZXdzdGFtYWdvLmNvbQp8fG5ld3N0YXBhLm9yZwpu +ZXdzdGFybmV0LmNvbQoubmV3dGFpd2FuLmNvbS50dwpuZXd0YWxrLnR3Cnx8bmV3 +dGFsay50dwpuZXd5b3JrdGltZXMuY29tCnx8bmV4b24uY29tCi5uZXh0MTEuY28u +anAKLm5leHRtYWcuY29tLnR3CgohLS1oayoubmV4dG1lZGlhLmNvbQohLS10dyou +bmV4dG1lZGlhLmNvbQohLS1zdGF0aWMqLm5leHRtZWRpYS5jb20KLm5leHRtZWRp +YS5jb20KCnx8bmV4dG9uLW5ldC5qcApuZXh0dHYuY29tLnR3Ci5uZmp0eWQuY29t +Cnx8Y28ubmcubWlsCnx8bmdhLm1pbApuZ2Vuc2lzLmNvbQoubmhlbnRhaS5uZXQK +fGh0dHA6Ly9uaGVudGFpLm5ldAoubmhrLW9uZGVtYW5kLmpwCi5uaWNvdmlkZW8u +anAvd2F0Y2gKIS0tfHxuaWNvdmlkZW8uanAKfHxuaWdob3N0Lm9yZwphdi5uaWdo +dGxpZmUxNDEuY29tCm5pbmVjb21tZW50YXJpZXMuY29tCi5uaW5qYWNsb2FrLmNv +bQp8fG5pbmphcHJveHkubmluamEKbmludGVuZGl1bS5jb20KdGFpd2FueWVzLm5p +bmcuY29tCnVzbWd0Y2cubmluZy5jb20vZm9ydW0KfHxuaXVzbmV3cy5jb20KfHxu +amFjdGIub3JnCm5qdWljZS5jb20KfHxuanVpY2UuY29tCm5sZnJlZXZwbi5jb20K +CiEtLW5vLWlwLmNvbSNOT0lQCi5kZG5zLm5ldC8KLmdvb2RkbnMuaW5mbwp8fGdv +dGRucy5jaAoubWFpbGRucy54eXoKLm5vLWlwLm9yZwoub3BlbmRuLnh5egouc2Vy +dmVodHRwLmNvbQpzeXRlcy5uZXQKLndob2Rucy54eXoKLnphcHRvLm9yZwp8aHR0 +cDovL2R5bnVwZGF0ZS5uby1pcC5jb20vCgp8fG5vYmVsLnNlCiEtLS5ub2JlbHBy +aXplLm9yZwohLS18aHR0cDovL25vYmVscHJpemUub3JnCm5vYmVscHJpemUub3Jn +L25vYmVsX3ByaXplcy9wZWFjZS9sYXVyZWF0ZXMvMTk4OQpub2JlbHByaXplLm9y +Zy9ub2JlbF9wcml6ZXMvcGVhY2UvbGF1cmVhdGVzLzIwMTAKbm9ib2R5Y2Fuc3Rv +cC51cwp8fG5vYm9keWNhbnN0b3AudXMKfHxub2tvZ2lyaS5vcmcKfHxub2tvbGEu +Y29tCm5vb2RsZXZwbi5jb20KLm5vcmJ1bGluZ2thLm9yZwpub3JkdnBuLmNvbQp8 +fG5vcmR2cG4uY29tCnx8bm92ZWxhc2lhLmNvbQoubmV3cy5ub3cuY29tCnxodHRw +Oi8vbmV3cy5ub3cuY29tCiEtLXxodHRwOi8vbmV3cy5ub3cuY29tL2hvbWUqCm5l +d3Mubm93LmNvbSUyRmhvbWUKfHxub3duZXdzLmNvbQoubm93dG9ycmVudHMuY29t +Ci5ub3lwZi5jb20KfHxub3lwZi5jb20KfHxucGEuZ28uanAKLm5wbnQubWUKfGh0 +dHA6Ly9ucG50Lm1lCi5ucHMuZ292Ci5ucmFkaW8ubWUKfGh0dHA6Ly9ucmFkaW8u +bWUKLm5yay5ubwp8fG5yay5ubwoubnRkLnR2Cnx8bnRkLnR2Cm50ZHR2LmNvbQou +bnRkdHYuY28ua3IKbnRkdHYuY2EKbnRkdHYub3JnCm50ZHR2LnJ1Cm50ZHR2bGEu +Y29tCi5udHJmdW4uY29tCnx8Y2JzLm50dS5lZHUudHcKfHxtZWRpYS5udS5ubAou +bnViaWxlcy5uZXQKfHxudWV4cG8uY29tCi5udWtpc3RyZWFtLmNvbQp8fG51cmdv +LXNvZnR3YXJlLmNvbQp8fG51dGFrdS5uZXQKLm51dmlkLmNvbQp8fG52ZHN0LmNv +bQpudXpjb20uY29tCi5udnF1YW4ub3JnCi5udnRvbmd6aGlzaGVuZy5vcmcKfGh0 +dHA6Ly9udnRvbmd6aGlzaGVuZy5vcmcKLm53dGNhLm9yZwp8aHR0cDovL255YWEu +ZXUKIS0tfHxueWFhLnNpCi5ueWR1cy5jYQpueWxvbi1hbmdlbC5jb20Kbnlsb25z +dG9ja2luZ3NvbmxpbmUuY29tCiEtLW55c2luZ3Rhby5jb20KLm56Y2hpbmVzZS5j +b20KfHxuemNoaW5lc2UubmV0Lm56CgohLS0tLS0tLS0tLS0tLS0tLS0tLS1PTy0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kb2JzZXJ2ZWNoaW5hLm5ldAoub2J1dHUu +Y29tCm9jYXNwcm8uY29tCm9jY3VweXRpYW5hbm1lbi5jb20Kb2NscC5oawoub2Ny +ZWFtcGllcy5jb20KfHxvY3RvYmVyLXJldmlldy5vcmcKb2ZmYmVhdGNoaW5hLmNv +bQpvZmZpY2VvZnRpYmV0LmNvbQp8aHR0cDovL29maWxlLm9yZwp8fG9nYW9nYS5v +cmcKdHd0cjJzcmMub2dhb2dhLm9yZwoub2dhdGUub3JnCnx8b2dhdGUub3JnCnd3 +dzIub2hjaHIub3JnL2VuZ2xpc2gvYm9kaWVzL2NhdC9kb2NzL25nb3MvSUlfQ2hp +bmFfNDEucGRmCi5vaWtvcy5jb20udHcvdjQKLm9pa3R2LmNvbQpvaXpvYmxvZy5j +b20KLm9rLnJ1Cnx8b2sucnUKLm9rYXlmcmVlZG9tLmNvbQp8fG9rYXlmcmVlZG9t +LmNvbQpva2sudHcKfGh0dHA6Ly9maWxteS5vbGFibG9nYS5wbC9wbGF5ZXIKb2xk +LWNhdC5uZXQKfHxvbHVtcG8uY29tCi5vbHltcGljd2F0Y2gub3JnCm9tZ2lsaS5j +b20KfHxvbW5pdGFsay5jb20KfHxvbW5pdGFsay5vcmcKY2xpbmcub215LnNnCmZv +cnVtLm9teS5zZwpuZXdzLm9teS5zZwpzaG93Yml6Lm9teS5zZwp8fG9uLmNjCnx8 +b25lZHJpdmUubGl2ZS5jb20KfHxvbmlvbi5jaXR5Ci5vbmxpbmVjaGEuY29tCnx8 +b25saW5leW91dHViZS5jb20KLm9ubHl0d2VldHMuY29tCnxodHRwOi8vb25seXR3 +ZWV0cy5jb20Kb25tb29uLm5ldApvbm1vb24uY29tCi5vbnRoZWh1bnQuY29tCnxo +dHRwOi8vb250aGVodW50LmNvbQoub29wc2ZvcnVtLmNvbQpvcGVuLmNvbS5oawpv +cGVuYWxsd2ViLmNvbQpvcGVuZGVtb2NyYWN5Lm5ldAp8fG9wZW5kZW1vY3JhY3ku +bmV0Ci5vcGVuZXJ2cG4uaW4Kb3BlbmlkLm5ldAp8fG9wZW5pZC5uZXQKLm9wZW5s +ZWFrcy5vcmcKfHxvcGVubGVha3Mub3JnCm9wZW52cG4ubmV0Cnx8b3BlbnZwbi5u +ZXQKfHxvcGVud2Vic3Rlci5jb20KLm9wZW53cnQub3JnLmNuCkBAfHxvcGVud3J0 +Lm9yZy5jbgpteS5vcGVyYS5jb20vZGFoZW1hCnx8ZGVtby5vcGVyYS1taW5pLm5l +dAp3d3cub3JjaGlkYmJzLmNvbQoub3JnYW5jYXJlLm9yZy50dwpvcmdhbmhhcnZl +c3RpbnZlc3RpZ2F0aW9uLm5ldAoub3JnYXNtLmNvbQoub3JnZnJlZS5jb20KfHxv +cmllbnQtZG9sbC5jb20Kb3JpZW50YWxkYWlseS5jb20ubXkKfHxvcmllbnRhbGRh +aWx5LmNvbS5teQohLS1vcmllbnRhbGRhaWx5Lm9uLmNjCnx8b3JuLmpwCnQub3J6 +ZHJlYW0uY29tCnx8dC5vcnpkcmVhbS5jb20KdHVpLm9yemRyZWFtLmNvbQp8fG9y +emlzdGljLm9yZwp8fG9zZm9vcmEuY29tCi5vdG5kLm9yZwp8fG90bmQub3JnCnx8 +b3R0by5kZQp8fG91cmRlYXJhbXkuY29tCm91cnNvZ28uY29tCm91cnN0ZXBzLmNv +bS5hdQoub3Vyc3dlYi5uZXQKfHxvdXJ0di5oawp4aW5xaW1lbmcub3Zlci1ibG9n +LmNvbQp8fG92ZXJwbGF5Lm5ldApzaGFyZS5vdmkuY29tL21lZGlhCnxodHRwOi8v +b3dsLmxpCnxodHRwOi8vaHQubHkKfGh0dHA6Ly9odGwubGkKfGh0dHA6Ly9tYXNo +LnRvCnd3dy5vd2luZC5jb20KfGh0dHA6Ly93d3cub3hpZC5pdApveWF4LmNvbQpv +eWdoYW4uY29tL3dwcwoub3pjaGluZXNlLmNvbS9iYnMKfHxvdy5seQpiYnMub3pj +aGluZXNlLmNvbQoub3p2b2ljZS5vcmcKfHxvenZvaWNlLm9yZwoub3p4dy5jb20K +Lm96eW95by5jb20KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLVBQLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQp8fHBhY2hvc3RpbmcuY29tCi5wYWNpZmljcG9rZXIuY29t +Ci5wYWNrZXRpeC5uZXQKfHxwYWNvcGFjb21hbWEuY29tCi5wYWRtYW5ldC5jb20K +cGFnZTJyc3MuY29tCnx8cGFnb2RhYm94LmNvbQoucGFsYWNlbW9vbi5jb20KZm9y +dW0ucGFsbWlzbGlmZS5jb20KfHxlcml2ZXJzb2Z0LmNvbQoucGFsZGVuZ3lhbC5j +b20KcGFsam9ycHVibGljYXRpb25zLmNvbQoucGFsdGFsay5jb20KfHxwYW5nY2ku +bmV0Cnx8cGFuYWNvbS5jby5qcAp8fHBhbmRhcG93LmNvCi5wYW5kYXBvdy5uZXQK +LnBhbmRhdnBuLWpwLmNvbQoucGFubHVhbi5uZXQKfHxwYW5sdWFuLm5ldAp8fHBh +by1wYW8ubmV0CnBhcGVyLmxpCnBhcGVyYi51cwoucGFyYWRpc2VoaWxsLmNjCi5w +YXJhZGlzZXBva2VyLmNvbQoucGFydHljYXNpbm8uY29tCi5wYXJ0eXBva2VyLmNv +bQoucGFzc2lvbi5jb20KfHxwYXNzaW9uLmNvbQoucGFzc2lvbnRpbWVzLmhrCnBh +c3RlYmluLmNvbQoucGFzdGllLm9yZwp8fHBhc3RpZS5vcmcKfHxibG9nLnBhdGh0 +b3NoYXJlcG9pbnQuY29tCnBicy5vcmcvd2diaC9wYWdlcy9mcm9udGxpbmUvZ2F0 +ZQpwYnMub3JnL3dnYmgvcGFnZXMvZnJvbnRsaW5lL3RhbmttYW4KcGJzLm9yZy93 +Z2JoL3BhZ2VzL2Zyb250bGluZS90aWJldAp2aWRlby5wYnMub3JnCgohLS1QYndp +a2kKcGJ3aWtpLmNvbQp8fHBid29ya3MuY29tCnx8ZGV2ZWxvcGVycy5ib3gubmV0 +Cnx8d2lraS5vYXV0aC5uZXQKfHx3aWtpLnBob25lZ2FwLmNvbQp8fHdpa2kuanF1 +ZXJ5dWkuY29tCgp8fHBieGVzLmNvbQp8fHBieGVzLm9yZwpwY2R2ZC5jb20udHcK +LnBjaG9tZS5jb20udHcKfGh0dHA6Ly9wY2lqLm9yZwoucGNzdG9yZS5jb20udHcv +bnRkdHZhcHNob3AKfHxwY3Qub3JnLnR3CnBkZXRhaWxzLmNvbQp8fHBkcHJveHku +Y29tCnx8cGVhY2UuY2EKcGVhY2VmaXJlLm9yZwpwZWFjZWhhbGwuY29tCnx8cGVh Y2VoYWxsLmNvbQp8aHR0cDovL3BlYXJsaGVyLm9yZwoucGVlYXNpYW4uY29tCi5w ZWtpbmdkdWNrLm9yZwp8fHBla2luZ2R1Y2sub3JnCi5wZW11bGloYW4ub3IuaWQK fGh0dHA6Ly9wZW11bGloYW4ub3IuaWQKfHxwZW4uaW8KcGVuY2hpbmVzZS5jb20K @@ -1460,767 +1933,805 @@ bQoucGVudG95LmhrLyVFNCVCOCVBRCVFNSU5QyU4QgoucGVudG95LmhrLyVFNiU5 OSU4MiVFNCVCQSU4QgoucGVvcGxlYm9va2NhZmUuY29tCi5wZW9wbGVuZXdzLnR3 Cnx8cGVvcGxlbmV3cy50dwoucGVvcG8ub3JnCnx8cGVvcG8ub3JnCi5wZXJjeS5p bgoucGVyZmVjdGdpcmxzLm5ldApwZXJmZWN0dnBuLm5ldAoucGVyc2VjdXRpb25i -bG9nLmNvbQpwZmQub3JnLmhrCnBoYXBsdWFuLm9yZwpwaGF5dWwuY29tCnBoaWxi -b3JnZXMuY29tCnBoaWxseS5jb20KfHxwaG5jZG4uY29tCnx8cGhvdG9kaGFybWEu -bmV0Cnx8cGhvdG9mb2N1cy5jb20KfHxwaHVxdW9jc2VydmljZXMuY29tCi5waWNp -ZGFlLm5ldAp8fGltZyoucGljdHVyZWRpcC5jb20KcGljdHVyZXNvY2lhbC5jb20K -LnBpbjYuY29tCnx8cGluNi5jb20KLnBpbmcuZm0KfHxwaW5nLmZtCnx8cGlub3kt -bi5jb20KLnBpcG9zYXkuY29tCnBpcmFhdHRpbGFodGkub3JnCi5waXJpbmcuY29t -Cnx8cGl4ZWxxaS5jb20KfHxjc3MucGl4bmV0LmluCnx8cGl4bmV0Lm5ldAoucGl4 -bmV0Lm5ldAoucGsuY29tCnx8cGxhY2VtaXguY29tCiEtLS5wbGFuZXRzdXp5Lm9y -Zwp8aHR0cDovL3BpY3R1cmVzLnBsYXlib3kuY29tCnx8cGxheWJveS5jb20KLnBs -YXlib3lwbHVzLmNvbQp8fHBsYXlib3lwbHVzLmNvbQoucGxheW5vMS5jb20KfHxw -bGF5bm8xLmNvbQp8fHBsYXlwY2Vzb3IuY29tCnBsYXlzLmNvbS50dwp8fG0ucGxp -eGkuY29tCnBsbS5vcmcuaGsKcGx1bmRlci5jb20KLnBsdXMyOC5jb20KLnBsdXNi -Yi5jb20KLnBtYXRlaHVudGVyLmNvbQp8aHR0cDovL3BtYXRlaHVudGVyLmNvbQou -cG1hdGVzLmNvbQp8fHBvMmIuY29tCiEtLXx8cG9jb28ub3JnCnx8cG9kaWN0aW9u -YXJ5LmNvbQoucG9rZXJzdGFycy5uZXQKemgucG9rZXJzdHJhdGVneS5jb20KcG9s -aXRpY2FsY2hpbmEub3JnCnBvbGl0aWNhbGNvbnN1bHRhdGlvbi5vcmcKLnBvbHlt -ZXJoay5jb20KfGh0dHA6Ly9wb2x5bWVyaGsuY29tCi5wb3BvLnR3CiEtLXx8cG9w -dWxhcnBhZ2VzLm5ldAp8fHBvcHZvdGUuaGsKcG9weWFyZC5jb20KfHxwb3B5YXJk -Lm9yZwoucG9ybi5jb20KLnBvcm4yLmNvbQoucG9ybjUuY29tCi5wb3JuYmFzZS5v -cmcKLnBvcm5lcmJyb3MuY29tCnx8cG9ybmhkLmNvbQoucG9ybmhvc3QuY29tCi5w -b3JuaHViLmNvbQp8fHBvcm5tbS5uZXQKLnBvcm5veG8uY29tCi5wb3JucmFwaWRz -aGFyZS5jb20KfHxwb3JucmFwaWRzaGFyZS5jb20KLnBvcm5zaGFyaW5nLmNvbQp8 -aHR0cDovL3Bvcm5zaGFyaW5nLmNvbQoucG9ybnNvY2tldC5jb20KLnBvcm5zdGFy -Y2x1Yi5jb20KfHxwb3Juc3RhcmNsdWIuY29tCi5wb3JudHViZS5jb20KLnBvcm50 -dWJlbmV3cy5jb20KLnBvcm50dmJsb2cuY29tCnx8cG9ybnR2YmxvZy5jb20KLnBv -cm52aXNpdC5jb20KLnBvcnRhYmxldnBuLm5sCnx8cG9za290YW5ld3MuY29tCi5w -b3N0ODUyLmNvbQpwb3N0YWR1bHQuY29tCi5wb3N0aW1nLm9yZwp8fHBvd2VyY3gu -Y29tCi5wb3dlcnBob3RvLm9yZwp8fHd3dy5wb3dlcnBvaW50bmluamEuY29tCnx8 -Y2RuLnByaW50ZnJpZW5kbHkuY29tCi5wcml0dW5sLmNvbQpwcm92cG5hY2NvdW50 -cy5jb20KLnByb3hmcmVlLmNvbQp8fHByb3hmcmVlLmNvbQpwcm94eWFub25pbW8u -ZXMKLnByb3h5bmV0d29yay5vcmcudWsKfHxwcm94eW5ldHdvcmsub3JnLnVrCnx8 -cHRzLm9yZy50dwoucHR0dmFuLm9yZwpwdWJ1LmNvbS50dwpwdWZmaW5icm93c2Vy -LmNvbQpwdXJlaW5zaWdodC5vcmcKLnB1dHR5Lm9yZwp8fHB1dHR5Lm9yZwoKIS0t -LS0tLS0tLS0tLS1Qb3N0ZXJvdXMtLS0tLQp8fGNhbGViZWxzdG9uLmNvbQp8fGJs -b2cuZml6emlrLmNvbQp8fG5mLmlkLmF1Cnx8c29ncmFkeS5tZQp8fHZhdG4ub3Jn -Cnx8dmVudHVyZXN3ZWxsLmNvbQp8fHdoZXJlaXN3ZXJuZXIuY29tCgoucG93ZXIu -Y29tCnx8cG93ZXIuY29tCnBvd2VyYXBwbGUuY29tCnx8YWJjLnBwLnJ1CmhlaXgu -cHAucnUKfHxwcmF5Zm9yY2hpbmEubmV0Cnx8cHJlbWVmb3J3aW5kb3dzNy5jb20K -fHxwcmVzZW50YXRpb256ZW4uY29tCnx8cHJlc3RpZ2UtYXYuY29tCnByaXNvbmVy -LXN0YXRlLXNlY3JldC1qb3VybmFsLXByZW1pZXIKLnByaXNvbmVyYWxlcnQuY29t -Cnx8cHJpdHVubC5jb20KfHxwcml2YWN5Ym94LmRlCi5wcml2YXRlLmNvbS9ob21l -Cnx8cHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbQpwcml2YXRlcGFzdGUuY29tCnx8 -cHJpdmF0ZXBhc3RlLmNvbQpwcml2YXRldHVubmVsLmNvbQp8fHByaXZhdGV0dW5u -ZWwuY29tCnx8cHJpdmF0ZXZwbi5jb20KfHxwcm9jb3B5dGlwcy5jb20KcHJvdmlk -ZW9jb2FsaXRpb24uY29tCnx8cHJvc2liZW4uZGUKcHJveGlmaWVyLmNvbQphcGku -cHJveGxldC5jb20KfHxwcm94b21pdHJvbi5pbmZvCi5wcm94cG4uY29tCnx8cHJv -eHBuLmNvbQpwcm94eS5vcmcKLnByb3h5bGlzdC5vcmcudWsKfHxwcm94eWxpc3Qu -b3JnLnVrCi5wcm94eXB5Lm5ldAp8fHByb3h5cHkubmV0CnByb3h5cm9hZC5jb20K -LnByb3h5dHVubmVsLm5ldAohLS00MDMgbWF5YmUKfHxwcm95ZWN0b2NsdWJlcy5j -b20KcHJvenoubmV0CnBzYmxvZy5uYW1lCnx8cHNibG9nLm5hbWUKfHxwc2lwaG9u -LmNhCi5wc2lwaG9uMy5jb20KfHxwc2lwaG9uMy5jb20KLnB0dC5jYwp8fHB0dC5j -YwoucHVmZnN0b3JlLmNvbQoucHV1a28uY29tCnx8cHVsbGZvbGlvLmNvbQoucHVu -eXUuY29tL3B1bnkKfHxwdXJlY29uY2VwdHMubmV0Cnx8cHVyZWluc2lnaHQub3Jn -Cnx8cHVyZXBkZi5jb20KfHxwdXJldnBuLmNvbQoucHVycGxlbG90dXMub3JnCi5w -dXNzeXNwYWNlLmNvbQoucHV0aWhvbWUub3JnCi5wdXRsb2NrZXIuY29tL2ZpbGUK -cHduZWQuY29tCnB5dGhvbi5jb20KLnB5dGhvbi5jb20udHcKfGh0dHA6Ly9weXRo -b24uY29tLnR3CnB5dGhvbmhhY2tlcnMuY29tL3AKCiEtLS0tLS0tLS0tLS0tLS0t -LS0tLVFRLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoucWFub3RlLmNvbQp8fHFh -bm90ZS5jb20KLnFnaXJsLmNvbS50dwpxaS1nb25nLm1lCi5xaWRpYW4uY2EKLnFp -ZW5rdWVuLm9yZwp8fHFpZW5rdWVuLm9yZwp8fHFpd2VuLmx1CnFpeGlhbmdsdS5j -bgpiYnMucW16ZGQuY29tCi5xa3NoYXJlLmNvbQpxb29zLmNvbQp8fHFvb3MuY29t -CmJsb2cucW9vemEuaGsvZGFmZW5ncWl4aQp8fGVma3NvZnQuY29tCnx8cXN0YXR1 -cy5jb20KfHxxdHdlZXRlci5jb20KfHxxdHJhYy5ldQp8fHF1aXRjY3AubmV0Ci5x -dWl0Y2NwLm5ldAp8fHF1aXRjY3Aub3JnCi5xdWl0Y2NwLm9yZwoucXVyYW4uY29t -CnxodHRwOi8vcXVyYW4uY29tCi5xdXJhbmV4cGxvcmVyLmNvbQpxdXNpOC5uZXQK -LnF2b2R6eS5vcmcKbmVtZXNpczIucXgubmV0L3BhZ2VzL015RW5UdW5uZWwKcXhi -YnMub3JnCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1SUi0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0KLnJhLmdnCnxodHRwOi8vcmEuZ2cvCi5yYWRpY2FscGFydHkub3Jn -Cnx8cmFlbC5vcmcKcmFkaWNhbHBhcnR5Lm9yZwpyYWRpb2F1c3RyYWxpYS5uZXQu -YXUKLnJhZGlvaGlsaWdodC5uZXQKfHxyYWRpb2hpbGlnaHQubmV0Cm9wbWwucmFk -aW90aW1lLmNvbQp8fHJhZGlvdmF0aWNhbmEub3JnCnx8cmFkaW92bmNyLmNvbQp8 -fHJhZ2dlZGJhbm5lci5jb20KfHxyYWlkY2FsbC5jb20udHcKLnJhaWR0YWxrLmNv -bS50dwoucmFpbmJvd3BsYW4ub3JnL2JicwoucmFpem9qaS5vci5qcAp8aHR0cDov -L3JhaXpvamkub3IuanAKcmFuZ3dhbmcuYml6CnJhbmd6ZW4uY29tCnJhbmd6ZW4u -bmV0CnJhbmd6ZW4ub3JnCnxodHRwOi8vYmxvZy5yYW54aWFuZy5jb20vCnJhbnl1 -bmZlaS5jb20KfHxyYW55dW5mZWkuY29tCi5yYXBidWxsLm5ldAp8aHR0cDovL3Jh -cGlkZ2F0b3IubmV0Lwp8fHJhcGlkbW92aWV6LmNvbQpyYXBpZHZwbi5jb20KfHxy -YXBpZHZwbi5jb20KLnJhcmVtb3ZpZS5jYwp8aHR0cDovL3JhcmVtb3ZpZS5jYwou -cmFyZW1vdmllLm5ldAp8aHR0cDovL3JhcmVtb3ZpZS5uZXQKIS0tLnJheWZtZS5j -b20vYmJzCnx8cmF6eWJvYXJkLmNvbQpyY2luZXQuY2EKLnJlYWQxMDAuY29tCi5y -ZWFkaW5ndGltZXMuY29tLnR3Cnx8cmVhZGluZ3RpbWVzLmNvbS50dwp8fHJlYWRt -b28uY29tCi5yZWFkeWRvd24uY29tCnxodHRwOi8vcmVhZHlkb3duLmNvbQoucmVh -bGNvdXJhZ2Uub3JnCi5yZWFscmFwdGFsay5jb20KLnJlY29yZGhpc3Rvcnkub3Jn -Ci5yZWNvdmVyeS5vcmcudHcKfGh0dHA6Ly9vbmxpbmUucmVjb3Zlcnl2ZXJzaW9u -Lm9yZwp8fHJlY292ZXJ5dmVyc2lvbi5jb20udHcKLnJlZGNoaW5hY24ubmV0Cnxo -dHRwOi8vcmVkY2hpbmFjbi5uZXQKcmVkY2hpbmFjbi5vcmcKcmVkdHViZS5jb20K -cmVmZXJlci51cwp8fHJlZmVyZXIudXMKfHxyZWZsZWN0aXZlY29kZS5jb20KcmVs -YXhiYnMuY29tCi5yZWxheS5jb20udHcKLnJlbGVhc2VpbnRlcm5hdGlvbmFsLm9y -ZwpyZWxpZ2lvdXN0b2xlcmFuY2Uub3JnCnJlbm1pbmJhby5jb20KLnJlbnl1cmVu -cXVhbi5vcmcKfHxyZW55dXJlbnF1YW4ub3JnCnxodHRwOi8vY2VydGlmaWNhdGUu -cmV2b2NhdGlvbmNoZWNrLmNvbQpzdWJhY21lLnJlcm91dGVkLm9yZwoucmV1dGVy -cy5jb20KLnJldmxlZnQuY29tCnJldHdlZXRpc3QuY29tCnx8cmV0d2VldHJhbmsu -Y29tCiEtLWNvbm5lY3RlZGNoaW5hLnJldXRlcnMuY29tCiEtLXxodHRwOi8vd3d3 -LnJldXRlcnMuY29tL25ld3MvdmlkZW8KcmV2dmVyLmNvbQoucmZhLm9yZwp8aHR0 -cDovL3JmYS5vcmcKLnJmYWNoaW5hLmNvbQoucmZhbW9iaWxlLm9yZwpyZmF3ZWIu -b3JnCnx8cmZlcmwub3JnCi5yZmkuZnIKfHxyZmkuZnIKfGh0dHA6Ly9yZmkubXkv -Ci5yaGNsb3VkLmNvbQohLS1FZGdlY2FzdAp8aHR0cDovL3Zkcy5yaWdodHN0ZXIu -Y29tLwoucmlncGEub3JnCi5yaWxleWd1aWRlLmNvbQpyaWt1Lm1lLwoucml0b3Vr -aS5qcAoucmx3bHcuY29tCnx8cmx3bHcuY29tCi5ybWpkdy5jb20KLnJtamR3MTMy -LmluZm8KLnJvYWRzaG93LmhrCnJvYnRleC5jb20KfHxyb2J1c3RuZXNzaXNrZXku -Y29tCnx8cm9jLXRhaXdhbi5vcmcKfHxyb2NrZXQtaW5jLm5ldAp8aHR0cDovL3d3 -dzIucm9ja2V0YmJzLmNvbS8xMS9iYnMuY2dpP2lkPTVtdXMKfGh0dHA6Ly93d3cy -LnJvY2tldGJicy5jb20vMTEvYmJzLmNnaT9pZD1mcmVlbWdsCnx8cm9jbXAub3Jn -Cnx8cm9qby5jb20KfHxyb25qb25lc3dyaXRlci5jb20KfHxyb2xpYS5uZXQKLnJv -b2RvLmNvbQoucm9zZWNoaW5hLm5ldAoucm90dGVuLmNvbQoucnNmLm9yZwp8fHJz -Zi5vcmcKLnJzZi1jaGluZXNlLm9yZwp8fHJzZi1jaGluZXNlLm9yZwoucnNnYW1l -bi5vcmcKfHxwaG9zcGhhdGlvbjEzLnJzc2luZy5jb20KLnJzc21lbWUuY29tCnx8 -cnNzbWVtZS5jb20KfHxydGFsYWJlbC5vcmcKLnJ0aGsuaGsKfGh0dHA6Ly9ydGhr -LmhrCi5ydGhrLm9yZy5oawp8aHR0cDovL3J0aGsub3JnLmhrCnJ0aS5vcmcudHcK -LnJ0eWNtaW5uZXNvdGEub3JnCi5ydWFueWlmZW5nLmNvbS9ibG9nKnNvbWVfd2F5 -c190b19icmVha190aGVfZ3JlYXRfZmlyZXdhbGwKcnVrb3Iub3JnCi5ydXNoYmVl -LmNvbQpydXR1YmUucnUKLnJ1eWlzZWVrLmNvbQoucnhoai5uZXQKfGh0dHA6Ly9y -eGhqLm5ldAoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tU1MtLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tCi5zMXMxczEuY29tCnx8cy1jdXRlLmNvbQoucy1kcmFnb24ub3Jn -Cnx8czFoZW5nLmNvbQp8aHR0cDovL3d3dy5zNG1pbmlhcmNoaXZlLmNvbQp8fHM4 -Zm9ydW0uY29tCmNkbjEubHAuc2Fib29tLmNvbQpzYWNvbS5oawp8fHNhY29tLmhr -Cnx8c2FkcGFuZGEudXMKLnNhZmVydnBuLmNvbQp8fHNhZmVydnBuLmNvbQouc2Fp -cS5tZQp8fHNhaXEubWUKfHxzYWt1cmFsaXZlLmNvbQouc2FreWEub3JnCi5zYWx2 -YXRpb24ub3JnLmhrCnx8c2FsdmF0aW9uLm9yZy5oawouc2FtYWlyLnJ1L3Byb3h5 -L3R5cGUtMDEKLnNhbWJob3RhLm9yZwouY24uc2FuZHNjb3RhaWNlbnRyYWwuY29t -CnxodHRwOi8vY24uc2FuZHNjb3RhaWNlbnRyYWwuY29tCi5zYW5taW4uY29tLnR3 -CnNhcGlrYWNodS5uZXQKc2F2ZW1lZGlhLmNvbQpzYXZldGliZXQuZGUKc2F2ZXRp -YmV0LmZyCnNhdmV0aWJldC5ubAouc2F2ZXRpYmV0Lm9yZwp8fHNhdmV0aWJldC5v -cmcKc2F2ZXRpYmV0LnJ1CnNhdmV2aWQuY29tCnx8c2F5Mi5pbmZvCi5zYm1lLm1l -CnxodHRwOi8vc2JtZS5tZQouc2Nhc2luby5jb20KfGh0dHA6Ly93d3cuc2NpZW5j -ZW1hZy5vcmcvY29udGVudC8zNDQvNjE4Ny85NTMKLnNjaWVuY2VuZXRzLmNvbQp8 -fHNjaWh1Yi5vcmcKLnNjbXAuY29tCi5zY21wY2hpbmVzZS5jb20KfHxzY3JhbWJs -ZS5pbwouc2NyaWJkLmNvbQp8fHNjcmlwdHNwb3QuY29tCnNlYXB1ZmYuY29tCmRv -bWFpbmhlbHAuc2VhcmNoLmNvbQouc2VhcmNodHJ1dGguY29tCnNlY3JldGNoaW5h -LmNvbQp8fHNlY3JldGdhcmRlbi5ubwouc2VjcmV0c2xpbmUuYml6Cnx8c2VjcmV0 -c2xpbmUuYml6Cnx8c2VjdXJldHVubmVsLmNvbQpzZWN1cml0eWtpc3MuY29tCnNl -ZXNtaWMuY29tCnx8c2VldnBuLmNvbQp8fHNlZXpvbmUubmV0CnNlamllLmNvbQou -c2VuZHNwYWNlLmNvbQp8aHR0cDovL3R3ZWV0cy5zZXJhcGgubWUvCnNlc2F3ZS5u -ZXQKfHxzZXNhd2UubmV0Ci5zZXNhd2Uub3JnCnx8c2V0aHdrbGVpbi5uZXQKLnNl -dG4uY29tCmZvcnVtLnNldHR5LmNvbS50dwouc2V2ZW5sb2FkLmNvbQp8fHNldmVu -bG9hZC5jb20KLnNleC5jb20KLnNleC0xMS5jb20KfHxzZXgzLmNvbQp8fHNleDgu -Y2MKLnNleGFuZHN1Ym1pc3Npb24uY29tCi5zZXhib3QuY29tCi5zZXhodS5jb20K -LnNleGh1YW5nLmNvbQpzZXhpbnNleC5uZXQKfHxzZXhpbnNleC5uZXQKLnNleHR2 -eC5jb20KCiEtLUlQIG9mIFNleEluU2V4CjY3LjIyMC45MS4xNQo2Ny4yMjAuOTEu -MTgKNjcuMjIwLjkxLjIzCgp8aHR0cDovLyouc2YubmV0Ci5zZmlsZXlkeS5jb20K -fHxzZnNoaWJhby5jb20KLnNmdGluZGlhLm9yZwouc2Z0dWsub3JnCnx8c2Z0dWsu -b3JnCnNoYWRvdy5tYQouc2hhZG93c2t5Lnh5egouc2hhZG93c29ja3MuY29tCi5z -aGFkb3dzb2Nrcy5vcmcKfHxzaGFkb3dzb2Nrcy5vcmcKfGh0dHA6Ly9jbi5zaGFm -YXFuYS5jb20Kc2hhaGFtYXQtZW5nbGlzaC5jb20KLnNoYW1iaGFsYXN1bi5jb20K -LnNoYW5nZmFuZy5vcmcKfHxzaGFuZ2Zhbmcub3JnCnNoYXBlc2VydmljZXMuY29t -Ci5zaGFyZWJlZS5jb20KfHxzaGFyZWNvb2wub3JnCiEtLXx8c2hhcmtkb2xwaGlu -LmNvbQpzaGFycGRhaWx5LmNvbS5oawp8fHNoYXJwZGFpbHkuY29tLmhrCi5zaGFy -cGRhaWx5LmhrCi5zaGFycGRhaWx5LnR3Ci5zaGF0LXRpYmV0LmNvbQpzaGVpa3ll -cm1hbWkuY29tCi5zaGVsbGZpcmUuZGUKfHxzaGVsbGZpcmUuZGUKLnNoZW5zaG91 -Lm9yZwpzaGVueXVuLmNvbQpzaGVueXVucGVyZm9ybWluZ2FydHMub3JnCnx8c2hl -bnl1bnBlcmZvcm1pbmdhcnRzLm9yZwpzaGVuemhvdWZpbG0uY29tCnx8c2hlbnpo -b3VmaWxtLmNvbQp8fHNoZXJhYmd5YWx0c2VuLmNvbQouc2hpYXR2Lm5ldAouc2hp -Y2hlbmcub3JnCnNoaW55Y2hhbi5jb20Kc2hpcGNhbW91ZmxhZ2UuY29tCi5zaGl0 -YW90di5vcmcKfHxzaGl4aWFvLm9yZwp8fHNoaXpoYW8ub3JnCnNoaXpoYW8ub3Jn -CnNoa3Nwci5tb2JpL2RhYnIKfHxzaG9kYW5ocS5jb20KLnNob3AyMDAwLmNvbS50 -dwouc2hvcHBpbmcuY29tCi5zaG93aGFvdHUuY29tCi5zaG93dGltZS5qcApjaC5z -aHZvb25nLmNvbQouc2h3Y2h1cmNoLm9yZwouc2h3Y2h1cmNoMy5jb20KfGh0dHA6 -Ly9zaHdjaHVyY2gzLmNvbQp8fHNpZGVsaW5lc25ld3MuY29tCi5zaWRlbGluZXNz -cG9ydHNlYXRlcnkuY29tCi5zaWppaHVpc3VvLmNsdWIKLnNpamlodWlzdW8uY29t -Ci5zaWxrYm9vay5jb20Kc2ltcGxlY2Qub3JnCnx8c2ltcGxlY2Qub3JnCkBAfHxz -aW1wbGVjZC5tZQpzaW1wbGVwcm9kdWN0aXZpdHlibG9nLmNvbQpiYnMuc2luYS5j -b20vCmJicy5zaW5hLmNvbSUyRgpibG9nLnNpbmEuY29tLnR3CmRhaWx5bmV3cy5z -aW5hLmNvbS8KZGFpbHluZXdzLnNpbmEuY29tJTJGCmZvcnVtLnNpbmEuY29tLmhr -CmhvbWUuc2luYS5jb20KfHxtYWdhemluZXMuc2luYS5jb20udHcKbmV3cy5zaW5h -LmNvbS5oawpuZXdzLnNpbmEuY29tLnR3Cm5ld3Muc2luY2hldy5jb20ubXkKLnNp -bmNoZXcuY29tLm15L25vZGUvCi5zaW5jaGV3LmNvbS5teS90YXhvbm9teS90ZXJt -Ci5zaW5nYXBvcmVwb29scy5jb20uc2cKfHxzaW5nYXBvcmVwb29scy5jb20uc2cK -LnNpbmdmb3J0aWJldC5jb20KLnNpbmdwYW8uY29tLmhrCnNpbmd0YW8uY29tCnx8 -c2luZ3Rhby5jb20KbmV3cy5zaW5ndGFvLmNhCiEtLXx8Y2RwLnNpbmljYS5lZHUu -dHcKc2luby1tb250aGx5LmNvbQp8fHNpbm9jYXN0LmNvbQpzaW5vY2lzbS5jb20K -c2lub21vbnRyZWFsLmNhCi5zaW5vbmV0LmNhCi5zaW5vcGl0dC5pbmZvCi5zaW5v -YW50cy5jb20KfHxzaW5vYW50cy5jb20KLnNpbm9xdWViZWMuY29tCnx8c2l0ZTkw -Lm5ldAouc2l0ZWJyby50dwp8fHNpdGVrcmVhdG9yLmNvbQp8fHNpdGVrcy51ay50 -bwp8fHNpdGVtYXBzLm9yZwpzaXRldGFnLnVzCnNpcy54eHgKfHxzaXMwMDEuY29t -CnNpczAwMS51cwouc2pydC5vcmcKfGh0dHA6Ly9zanJ0Lm9yZwp8fHNqdW0uY24K -fHxza2V0Y2hhcHBzb3VyY2VzLmNvbQp8fHNraW10dWJlLmNvbQp8fHNreWJldC5j -b20KfGh0dHA6Ly91c2Vycy5za3luZXQuYmUvcmV2ZXMvdGliZXRob21lLmh0bWwK -fGh0dHA6Ly9za3loaWdocHJlbWl1bS5jb20vCmJicy5za3lraXdpLmNvbQp8aHR0 -cDovL3d3dy5za3lwZS5jb20vaW50bC8KfGh0dHA6Ly93d3cuc2t5cGUuY29tL3po -LUhhbnQKfHxza3l2ZWdhcy5jb20KLnhza3l3YWxrZXIuY29tCnx8eHNreXdhbGtl -ci5jb20KbS5zbGFuZHIubmV0Cnx8c2xhdmFzb2Z0LmNvbQouc2xheXRpemxlLmNv -bQp8fHNsaGVuZy5jb20KLnNsaWRlc2hhcmUubmV0CmZvcnVtLnNsaW1lLmNvbS50 -dwouc2xpbmtzZXQuY29tCnx8c2xpY2t2cG4uY29tCi5zbHV0bG9hZC5jb20KfHxz -bWFydGRuc3Byb3h5LmNvbQpzbWNoYm9va3MuY29tCi5zbWguY29tLmF1L3dvcmxk -L2RlYXRoLW9mLWNoaW5lc2UtcGxheWJveS1sZWF2ZXMtZnJlc2gtc2NyYXRjaGVz -LWluLXBhcnR5LXBhaW50d29yay0yMDEyMDkwMy0yNWE4dgpzbWhyaWMub3JnCi5z -bWl0aC5lZHUvZGFsYWlsYW1hCi5zbXl4eS5vcmcKIS0tVE9ETy1uby1ob21lcGFn -ZQp8fHNuYXBjaGF0LmNvbQouc25hcHR1LmNvbQp8fHNuYXB0dS5jb20KfHxzbmRj -ZG4uY29tCnNuZWFrbWUubmV0Cnx8c25vb3Blci5jby51awpzbm93bGlvbnB1Yi5j -b20KfHxzby1nYS5uZXQKLnNvLWdhLm5ldAp8fHNvLW5ld3MuY29tCi5zby1uZXdz -LmNvbQpob21lLnNvLW5ldC5uZXQudHcveWlzYV90c2FpCnx8c29jLm1pbAouc29j -a3NjYXA2NC5jb20KfHxzb2Nrc2xpc3QubmV0Ci5zb2NyZWMub3JnCnxodHRwOi8v -c29jcmVjLm9yZwouc29kLmNvLmpwCi5zb2Z0ZXRoZXIub3JnCnx8c29mdGV0aGVy -Lm9yZwouc29mdGV0aGVyLWRvd25sb2FkLmNvbQp8fHNvZnRldGhlci1kb3dubG9h -ZC5jb20KfHxjZG4uc29mdGxheWVyLm5ldAp8fHNvZ2NsdWIuY29tCnNvaGNyYWRp -by5jb20KfHxzb2hjcmFkaW8uY29tCnx8c29ydGluZy1hbGdvcml0aG1zLmNvbQou -c29zdGliZXQub3JnCi5zb3Vtby5pbmZvCnx8c291cC5pbwpAQHx8c3RhdGljLnNv -dXAuaW8KLnNvYmVlcy5jb20KfHxzb2JlZXMuY29tCnNvY2lhbHdoYWxlLmNvbQou -c29mdGV0aGVyLmNvLmpwCnx8c29mdHdhcmVieWNodWNrLmNvbQpibG9nLnNvZ29v -Lm9yZwpzb2gudHcKfHxzb2gudHcKc29oZnJhbmNlLm9yZwp8fHNvaGZyYW5jZS5v -cmcKY2hpbmVzZS5zb2lmaW5kLmNvbQpzb2thbW9ubGluZS5jb20KfHxzb21lZS5j -b20KLnNvbmdqaWFuanVuLmNvbQp8fHNvbmdqaWFuanVuLmNvbQouc29uaWNiYnMu -Y2MKLnNvbmlkb2RlbGFlc3BlcmFuemEub3JnCi5zb3BjYXN0LmNvbQouc29wY2Fz -dC5vcmcKLnNvcmF6b25lLm5ldAp8fHNvcy5vcmcKYmJzLnNvdS10b25nLm9yZwou -c291Ym9yeS5jb20KfGh0dHA6Ly9zb3Vib3J5LmNvbQouc291bC1wbHVzLm5ldAou -c291bGNhbGlidXJoZW50YWkubmV0Cnx8c291bGNhbGlidXJoZW50YWkubmV0Cnx8 -c291bmRjbG91ZC5jb20KIS0tfGh0dHBzOi8vc291bmRjbG91ZC5jb20vcHVua2dv -ZAouc291bmRvZmhvcGUua3IKc291bmRvZmhvcGUub3JnCnx8c291bmRvZmhvcGUu -b3JnCnx8c291cG9mbWVkaWEuY29tCiEtLS5zb3VyY2Vmb3JnZS5uZXQKIS18aHR0 -cDovL3NvdXJjZWZvcmdlLm5ldAp8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wKi9z -aGFkb3dzb2Nrc2d1aS8KfGh0dHA6Ly9uY2hjLmRsLnNvdXJjZWZvcmdlLm5ldAou -c291cmNld2FkaW8uY29tCnNvdXRobmV3cy5jb20udHcKc293ZXJzLm9yZy5oawp8 -fHdseC5zb3dpa2kubmV0Cnx8c3BhY2Utc2NhcGUuY29tCnx8c3BhbmtiYW5nLmNv -bQouc3Bhbmt3aXJlLmNvbQp8fHNwYi5jb20KfHxzcGVha2VyZGVjay5jb20Kc3Bl -bS5hdAp8fHNwZW5jZXJ0aXBwaW5nLmNvbQp8fHNwaWNldnBuLmNvbQouc3Bpa2Uu -Y29tCnNwaW5lanMuY29tCi5zcG90Zmx1eC5jb20KfHxzcG90Zmx1eC5jb20KLnNw -cmluZzR1LmluZm8KfGh0dHA6Ly9zcHJpbmc0dS5pbmZvCnx8c3Byb3V0Y29yZS5j -b20KfHxzcHJveHkuaW5mbwpzcXVhcmVzcGFjZS5jb20KfHxzcm9ja2V0LnVzCnx8 -c3NoOTEuY29tCi5zc3Byby5tbAp8aHR0cDovL3NzcHJvLm1sCnx8c3NzLmNhbXAK -IS0tfGh0dHA6Ly9jZG4uc3N0YXRpYy5uZXQvCnNzdG1sdC5uZXQKfHxzc3RtbHQu +bG9nLmNvbQoucGVyc2lhbmtpdHR5LmNvbQpwZmQub3JnLmhrCnBoYXBsdWFuLm9y +ZwpwaGF5dWwuY29tCnBoaWxib3JnZXMuY29tCnBoaWxseS5jb20KfHxwaG5jZG4u +Y29tCnx8cGhvdG9kaGFybWEubmV0Cnx8cGhvdG9mb2N1cy5jb20KfHxwaHVxdW9j +c2VydmljZXMuY29tCnx8cGljYWNvbWljY24uY29tCi5waWNpZGFlLm5ldAp8fGlt +ZyoucGljdHVyZWRpcC5jb20KcGljdHVyZXNvY2lhbC5jb20KfHxwaW4tY29uZy5j +b20KLnBpbjYuY29tCnx8cGluNi5jb20KLnBpbmcuZm0KfHxwaW5nLmZtCnx8cGlu +aW1nLmNvbQoucGlua3JvZC5jb20KfHxwaW5veS1uLmNvbQp8fHBpbnRlcmVzdC5h +dAp8fHBpbnRlcmVzdC5jby5rcgp8fHBpbnRlcmVzdC5jby51awoucGludGVyZXN0 +LmNvbQp8fHBpbnRlcmVzdC5jb20KfHxwaW50ZXJlc3QuZGUKfHxwaW50ZXJlc3Qu +ZGsKfHxwaW50ZXJlc3QuZnIKfHxwaW50ZXJlc3QuanAKfHxwaW50ZXJlc3QubmwK +fHxwaW50ZXJlc3Quc2UKLnBpcGlpLnR2Ci5waXBvc2F5LmNvbQpwaXJhYXR0aWxh +aHRpLm9yZwoucGlyaW5nLmNvbQp8fHBpeGVscWkuY29tCnx8Y3NzLnBpeG5ldC5p +bgp8fHBpeG5ldC5uZXQKLnBpeG5ldC5uZXQKLnBrLmNvbQp8fHBsYWNlbWl4LmNv +bQohLS0ucGxhbmV0c3V6eS5vcmcKfGh0dHA6Ly9waWN0dXJlcy5wbGF5Ym95LmNv +bQp8fHBsYXlib3kuY29tCi5wbGF5Ym95cGx1cy5jb20KfHxwbGF5Ym95cGx1cy5j +b20KfHxwbGF5ZXIuZm0KLnBsYXlubzEuY29tCnx8cGxheW5vMS5jb20KfHxwbGF5 +cGNlc29yLmNvbQpwbGF5cy5jb20udHcKfHxtLnBsaXhpLmNvbQpwbG0ub3JnLmhr +CnBsdW5kZXIuY29tCi5wbHVzMjguY29tCi5wbHVzYmIuY29tCi5wbWF0ZWh1bnRl +ci5jb20KfGh0dHA6Ly9wbWF0ZWh1bnRlci5jb20KLnBtYXRlcy5jb20KfHxwbzJi +LmNvbQpwb2JpZXJhbXkudG9wCiEtLXx8cG9jb28ub3JnCnx8cG9kaWN0aW9uYXJ5 +LmNvbQoucG9rZXJzdGFycy5uZXQKemgucG9rZXJzdHJhdGVneS5jb20KcG9saXRp +Y2FsY2hpbmEub3JnCnBvbGl0aWNhbGNvbnN1bHRhdGlvbi5vcmcKfHxwb2xvbmll +eC5jb20KLnBvbHltZXJoay5jb20KfGh0dHA6Ly9wb2x5bWVyaGsuY29tCi5wb3Bv +LnR3CiEtLXx8cG9wdWxhcnBhZ2VzLm5ldAp8fHBvcHZvdGUuaGsKcG9weWFyZC5j +b20KfHxwb3B5YXJkLm9yZwoucG9ybi5jb20KLnBvcm4yLmNvbQoucG9ybjUuY29t +Ci5wb3JuYmFzZS5vcmcKLnBvcm5lcmJyb3MuY29tCnx8cG9ybmhkLmNvbQoucG9y +bmhvc3QuY29tCi5wb3JuaHViLmNvbQp8fHBvcm5odWIuY29tCi5wb3JuaHViZGV1 +dHNjaC5uZXQKfGh0dHA6Ly9wb3JuaHViZGV1dHNjaC5uZXQKfHxwb3JubW0ubmV0 +Ci5wb3Jub3hvLmNvbQoucG9ybnJhcGlkc2hhcmUuY29tCnx8cG9ybnJhcGlkc2hh +cmUuY29tCi5wb3Juc2hhcmluZy5jb20KfGh0dHA6Ly9wb3Juc2hhcmluZy5jb20K +LnBvcm5zb2NrZXQuY29tCi5wb3Juc3RhcmNsdWIuY29tCnx8cG9ybnN0YXJjbHVi +LmNvbQoucG9ybnR1YmUuY29tCi5wb3JudHViZW5ld3MuY29tCi5wb3JudHZibG9n +LmNvbQp8fHBvcm50dmJsb2cuY29tCi5wb3JudmlzaXQuY29tCi5wb3J0YWJsZXZw +bi5ubAp8fHBvc2tvdGFuZXdzLmNvbQoucG9zdDAxLmNvbQoucG9zdDc2LmNvbQp8 +fHBvc3Q3Ni5jb20KLnBvc3Q4NTIuY29tCnBvc3RhZHVsdC5jb20KLnBvc3RpbWcu +b3JnCnx8cG90dnBuLmNvbQp8fHBvd2VyY3guY29tCi5wb3dlcnBob3RvLm9yZwp8 +fHd3dy5wb3dlcnBvaW50bmluamEuY29tCnx8cHJlc2lkZW50bGVlLnR3Cnx8Y2Ru +LnByaW50ZnJpZW5kbHkuY29tCi5wcml0dW5sLmNvbQpwcm92cG5hY2NvdW50cy5j +b20KfHxwcm92cG5hY2NvdW50cy5jb20KLnByb3hmcmVlLmNvbQp8fHByb3hmcmVl +LmNvbQpwcm94eWFub25pbW8uZXMKLnByb3h5bmV0d29yay5vcmcudWsKfHxwcm94 +eW5ldHdvcmsub3JnLnVrCnx8cHRzLm9yZy50dwoucHR0dmFuLm9yZwpwdWJ1LmNv +bS50dwpwdWZmaW5icm93c2VyLmNvbQpwdXJlaW5zaWdodC5vcmcKLnB1c2hjaGlu +YXdhbGwuY29tCi5wdXR0eS5vcmcKfHxwdXR0eS5vcmcKCiEtLS0tLS0tLS0tLS0t +UG9zdGVyb3VzLS0tLS0KfHxjYWxlYmVsc3Rvbi5jb20KfHxibG9nLmZpenppay5j +b20KfHxuZi5pZC5hdQp8fHNvZ3JhZHkubWUKfHx2YXRuLm9yZwp8fHZlbnR1cmVz +d2VsbC5jb20KfHx3aGVyZWlzd2VybmVyLmNvbQoKLnBvd2VyLmNvbQp8fHBvd2Vy +LmNvbQpwb3dlcmFwcGxlLmNvbQp8fHBvd2VyYXBwbGUuY29tCnx8YWJjLnBwLnJ1 +CmhlaXgucHAucnUKfHxwcmF5Zm9yY2hpbmEubmV0Cnx8cHJlbWVmb3J3aW5kb3dz +Ny5jb20KfHxwcmVzZW50YXRpb256ZW4uY29tCnx8cHJlc3RpZ2UtYXYuY29tCnBy +aXNvbmVyLXN0YXRlLXNlY3JldC1qb3VybmFsLXByZW1pZXIKLnByaXNvbmVyYWxl +cnQuY29tCnx8cHJpdHVubC5jb20KfHxwcml2YWN5Ym94LmRlCi5wcml2YXRlLmNv +bS9ob21lCnx8cHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbQpwcml2YXRlcGFzdGUu +Y29tCnx8cHJpdmF0ZXBhc3RlLmNvbQpwcml2YXRldHVubmVsLmNvbQp8fHByaXZh +dGV0dW5uZWwuY29tCnx8cHJpdmF0ZXZwbi5jb20KfHxwcm9jb3B5dGlwcy5jb20K +cHJvdmlkZW9jb2FsaXRpb24uY29tCnx8cHJvc2liZW4uZGUKcHJveGlmaWVyLmNv +bQphcGkucHJveGxldC5jb20KfHxwcm94b21pdHJvbi5pbmZvCi5wcm94cG4uY29t +Cnx8cHJveHBuLmNvbQoucHJveHlsaXN0Lm9yZy51awp8fHByb3h5bGlzdC5vcmcu +dWsKLnByb3h5cHkubmV0Cnx8cHJveHlweS5uZXQKcHJveHlyb2FkLmNvbQoucHJv +eHl0dW5uZWwubmV0CiEtLTQwMyBtYXliZQp8fHByb3llY3RvY2x1YmVzLmNvbQpw +cm96ei5uZXQKcHNibG9nLm5hbWUKfHxwc2Jsb2cubmFtZQp8fHBzaXBob24uY2EK +LnBzaXBob24zLmNvbQp8fHBzaXBob24zLmNvbQoucHNpcGhvbnRvZGF5LmNvbQou +cHR0LmNjCnx8cHR0LmNjCi5wdWZmc3RvcmUuY29tCi5wdXVrby5jb20KfHxwdWxs +Zm9saW8uY29tCi5wdW55dS5jb20vcHVueQp8fHB1cmVjb25jZXB0cy5uZXQKfHxw +dXJlaW5zaWdodC5vcmcKfHxwdXJlcGRmLmNvbQp8fHB1cmV2cG4uY29tCi5wdXJw +bGVsb3R1cy5vcmcKLnB1cnN1ZXN0YXIuY29tCnx8cHVyc3Vlc3Rhci5jb20KLnB1 +c3N5c3BhY2UuY29tCi5wdXRpaG9tZS5vcmcKLnB1dGxvY2tlci5jb20vZmlsZQpw +d25lZC5jb20KcHl0aG9uLmNvbQoucHl0aG9uLmNvbS50dwp8aHR0cDovL3B5dGhv +bi5jb20udHcKcHl0aG9uaGFja2Vycy5jb20vcAoKIS0tLS0tLS0tLS0tLS0tLS0t +LS0tUVEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi5xYW5vdGUuY29tCnx8cWFu +b3RlLmNvbQoucWdpcmwuY29tLnR3Cnx8cWlhbmRhby50b2RheQoucWktZ29uZy5t +ZQp8fHFpLWdvbmcubWUKIS0tIzkyMQp8fHFpYW5neW91Lm9yZwoucWlkaWFuLmNh +Ci5xaWVua3Vlbi5vcmcKfHxxaWVua3Vlbi5vcmcKfHxxaXdlbi5sdQpxaXhpYW5n +bHUuY24KYmJzLnFtemRkLmNvbQoucWtzaGFyZS5jb20KcW9vcy5jb20KfHxxb29z +LmNvbQpibG9nLnFvb3phLmhrL2RhZmVuZ3FpeGkKfHxlZmtzb2Z0LmNvbQp8fHFz +dGF0dXMuY29tCnx8cXR3ZWV0ZXIuY29tCnx8cXRyYWMuZXUKLnF1YW5uZW5nc2hl +bi5vcmcKfGh0dHA6Ly9xdWFubmVuZ3NoZW4ub3JnCnF1YW50dW1ib290ZXIubmV0 +Cnx8cXVpdGNjcC5uZXQKLnF1aXRjY3AubmV0Cnx8cXVpdGNjcC5vcmcKLnF1aXRj +Y3Aub3JnCi5xdW9yYS5jb20vQ2hpbmFzLUZ1dHVyZQoucXVyYW4uY29tCnxodHRw +Oi8vcXVyYW4uY29tCi5xdXJhbmV4cGxvcmVyLmNvbQpxdXNpOC5uZXQKLnF2b2R6 +eS5vcmcKbmVtZXNpczIucXgubmV0L3BhZ2VzL015RW5UdW5uZWwKcXhiYnMub3Jn +CgohLS0tLS0tLS0tLS0tLS0tLS0tLS1SUi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0KLnJhLmdnCnxodHRwOi8vcmEuZ2cvCi5yYWRpY2FscGFydHkub3JnCnx8cmFl +bC5vcmcKcmFkaWNhbHBhcnR5Lm9yZwpyYWRpb2F1c3RyYWxpYS5uZXQuYXUKLnJh +ZGlvaGlsaWdodC5uZXQKfHxyYWRpb2hpbGlnaHQubmV0Cm9wbWwucmFkaW90aW1l +LmNvbQp8fHJhZGlvdmF0aWNhbmEub3JnCnx8cmFkaW92bmNyLmNvbQp8fHJhZ2dl +ZGJhbm5lci5jb20KfHxyYWlkY2FsbC5jb20udHcKLnJhaWR0YWxrLmNvbS50dwou +cmFpbmJvd3BsYW4ub3JnL2Jicwp8aHR0cHM6Ly9yYWluZHJvcC5pby8KLnJhaXpv +amkub3IuanAKfGh0dHA6Ly9yYWl6b2ppLm9yLmpwCnJhbmd3YW5nLmJpegpyYW5n +emVuLmNvbQpyYW5nemVuLm5ldApyYW5nemVuLm9yZwp8aHR0cDovL2Jsb2cucmFu +eGlhbmcuY29tLwpyYW55dW5mZWkuY29tCnx8cmFueXVuZmVpLmNvbQoucmFwYnVs +bC5uZXQKfGh0dHA6Ly9yYXBpZGdhdG9yLm5ldC8KfHxyYXBpZG1vdmllei5jb20K +cmFwaWR2cG4uY29tCnx8cmFwaWR2cG4uY29tCi5yYXJlbW92aWUuY2MKfGh0dHA6 +Ly9yYXJlbW92aWUuY2MKLnJhcmVtb3ZpZS5uZXQKfGh0dHA6Ly9yYXJlbW92aWUu +bmV0Cnx8cmF3Z2l0LmNvbQp8fHJhd2dpdGh1Yi5jb20KIS0tLnJheWZtZS5jb20v +YmJzCnx8cmF6eWJvYXJkLmNvbQpyY2luZXQuY2EKLnJlYWQxMDAuY29tCi5yZWFk +aW5ndGltZXMuY29tLnR3Cnx8cmVhZGluZ3RpbWVzLmNvbS50dwp8fHJlYWRtb28u +Y29tCi5yZWFkeWRvd24uY29tCnxodHRwOi8vcmVhZHlkb3duLmNvbQoucmVhbGNv +dXJhZ2Uub3JnCi5yZWFsaXR5a2luZ3MuY29tCnx8cmVhbGl0eWtpbmdzLmNvbQou +cmVhbHJhcHRhbGsuY29tCi5yZWFsc2V4cGFzcy5jb20KLnJlY29yZGhpc3Rvcnku +b3JnCi5yZWNvdmVyeS5vcmcudHcKfGh0dHA6Ly9vbmxpbmUucmVjb3Zlcnl2ZXJz +aW9uLm9yZwp8fHJlY292ZXJ5dmVyc2lvbi5jb20udHcKfHxyZWQtbGFuZy5vcmcK +cmVkYmFsbG9vbnNvbGlkYXJpdHkub3JnCi5yZWRjaGluYWNuLm5ldAp8aHR0cDov +L3JlZGNoaW5hY24ubmV0CnJlZGNoaW5hY24ub3JnCnJlZHR1YmUuY29tCnJlZmVy +ZXIudXMKfHxyZWZlcmVyLnVzCnx8cmVmbGVjdGl2ZWNvZGUuY29tCnJlbGF4YmJz +LmNvbQoucmVsYXkuY29tLnR3Ci5yZWxlYXNlaW50ZXJuYXRpb25hbC5vcmcKcmVs +aWdpb3VzdG9sZXJhbmNlLm9yZwpyZW5taW5iYW8uY29tCnx8cmVubWluYmFvLmNv +bQoucmVueXVyZW5xdWFuLm9yZwp8fHJlbnl1cmVucXVhbi5vcmcKfGh0dHA6Ly9j +ZXJ0aWZpY2F0ZS5yZXZvY2F0aW9uY2hlY2suY29tCnN1YmFjbWUucmVyb3V0ZWQu +b3JnCnx8cmVzaWxpby5jb20KLnJldXRlcnMuY29tCnx8cmV1dGVycy5jb20KfHxy +ZXV0ZXJzbWVkaWEubmV0Ci5yZXZsZWZ0LmNvbQpyZXR3ZWV0aXN0LmNvbQp8fHJl +dHdlZXRyYW5rLmNvbQohLS1jb25uZWN0ZWRjaGluYS5yZXV0ZXJzLmNvbQohLS18 +aHR0cDovL3d3dy5yZXV0ZXJzLmNvbS9uZXdzL3ZpZGVvCnJldnZlci5jb20KLnJm +YS5vcmcKfHxyZmEub3JnCi5yZmFjaGluYS5jb20KLnJmYW1vYmlsZS5vcmcKcmZh +d2ViLm9yZwp8fHJmZXJsLm9yZwoucmZpLmZyCnx8cmZpLmZyCnxodHRwOi8vcmZp +Lm15LwohLS0ucmhjbG91ZC5jb20KIS0tRWRnZWNhc3QKfGh0dHA6Ly92ZHMucmln +aHRzdGVyLmNvbS8KLnJpZ3BhLm9yZwoucmlsZXlndWlkZS5jb20KcmlrdS5tZS8K +LnJpdG91a2kuanAKfHxyaXR0ZXIudmcKLnJsd2x3LmNvbQp8fHJsd2x3LmNvbQou +cm1qZHcuY29tCi5ybWpkdzEzMi5pbmZvCi5yb2Fkc2hvdy5oawoucm9ib2ZvcmV4 +LmNvbQp8fHJvYnVzdG5lc3Npc2tleS5jb20KIS0tfHxyb2MtdGFpd2FuLm9yZwp8 +fHJvY2tldC1pbmMubmV0CnxodHRwOi8vd3d3Mi5yb2NrZXRiYnMuY29tLzExL2Ji +cy5jZ2k/aWQ9NW11cwp8aHR0cDovL3d3dzIucm9ja2V0YmJzLmNvbS8xMS9iYnMu +Y2dpP2lkPWZyZWVtZ2wKIS0tfHxyb2NtcC5vcmcKfHxyb2pvLmNvbQp8fHJvbmpv +bmVzd3JpdGVyLmNvbQp8fHJvbGlhLm5ldAoucm9vZG8uY29tCi5yb3NlY2hpbmEu +bmV0Ci5yb3R0ZW4uY29tCi5yc2Yub3JnCnx8cnNmLm9yZwoucnNmLWNoaW5lc2Uu +b3JnCnx8cnNmLWNoaW5lc2Uub3JnCi5yc2dhbWVuLm9yZwp8fHBob3NwaGF0aW9u +MTMucnNzaW5nLmNvbQoucnNzbWVtZS5jb20KfHxyc3NtZW1lLmNvbQp8fHJ0YWxh +YmVsLm9yZwoucnRoay5oawp8aHR0cDovL3J0aGsuaGsKLnJ0aGsub3JnLmhrCnxo +dHRwOi8vcnRoay5vcmcuaGsKcnRpLm9yZy50dwoucnR5Y21pbm5lc290YS5vcmcK +LnJ1YW55aWZlbmcuY29tL2Jsb2cqc29tZV93YXlzX3RvX2JyZWFrX3RoZV9ncmVh +dF9maXJld2FsbApydWtvci5vcmcKLnJ1c2hiZWUuY29tCi5ydXRlbi5jb20udHcK +cnV0dWJlLnJ1Ci5ydXlpc2Vlay5jb20KLnJ4aGoubmV0CnxodHRwOi8vcnhoai5u +ZXQKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLVNTLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQouczFzMXMxLmNvbQp8fHMtY3V0ZS5jb20KLnMtZHJhZ29uLm9yZwp8fHMx +aGVuZy5jb20KfGh0dHA6Ly93d3cuczRtaW5pYXJjaGl2ZS5jb20KfHxzOGZvcnVt +LmNvbQpjZG4xLmxwLnNhYm9vbS5jb20KfHxzYWNrcy5jb20Kc2Fjb20uaGsKfHxz +YWNvbS5oawp8fHNhZHBhbmRhLnVzCi5zYWZlcnZwbi5jb20KfHxzYWZlcnZwbi5j +b20KLnNhaW50eWN1bHR1cmUuY29tCnxodHRwOi8vc2FpbnR5Y3VsdHVyZS5jb20K +LnNhaXEubWUKfHxzYWlxLm1lCnx8c2FrdXJhbGl2ZS5jb20KLnNha3lhLm9yZwou +c2FsdmF0aW9uLm9yZy5oawp8fHNhbHZhdGlvbi5vcmcuaGsKLnNhbWFpci5ydS9w +cm94eS90eXBlLTAxCi5zYW1iaG90YS5vcmcKLmNuLnNhbmRzY290YWljZW50cmFs +LmNvbQp8aHR0cDovL2NuLnNhbmRzY290YWljZW50cmFsLmNvbQouc2FubWluLmNv +bS50dwpzYXBpa2FjaHUubmV0CnNhdmVtZWRpYS5jb20Kc2F2ZXRpYmV0LmRlCnNh +dmV0aWJldC5mcgpzYXZldGliZXQubmwKLnNhdmV0aWJldC5vcmcKfHxzYXZldGli +ZXQub3JnCnNhdmV0aWJldC5ydQouc2F2ZXRpYmV0c3RvcmUub3JnCnx8c2F2ZXRp +YmV0c3RvcmUub3JnCnNhdmV2aWQuY29tCnx8c2F5Mi5pbmZvCi5zYm1lLm1lCnxo +dHRwOi8vc2JtZS5tZQouc2JzLmNvbS5hdS95b3VybGFuZ3VhZ2UKLnNjYXNpbm8u +Y29tCnxodHRwOi8vd3d3LnNjaWVuY2VtYWcub3JnL2NvbnRlbnQvMzQ0LzYxODcv +OTUzCi5zY2llbmNlbmV0cy5jb20KLnNjbXAuY29tCi5zY21wY2hpbmVzZS5jb20K +fHxzY3JhbWJsZS5pbwouc2NyaWJkLmNvbQp8fHNjcmliZC5jb20KfHxzY3JpcHRz +cG90LmNvbQpzZWFwdWZmLmNvbQpkb21haW5oZWxwLnNlYXJjaC5jb20KLnNlYXJj +aHRydXRoLmNvbQpzZWNyZXRjaGluYS5jb20KfHxzZWNyZXRjaGluYS5jb20KfHxz +ZWNyZXRnYXJkZW4ubm8KLnNlY3JldHNsaW5lLmJpegp8fHNlY3JldHNsaW5lLmJp +egp8fHNlY3VyZXR1bm5lbC5jb20KLnNlY3VyaXR5a2lzcy5jb20KfHxzZWN1cml0 +eWtpc3MuY29tCnx8c2VlZDQubWUKbmV3cy5zZWVodWEuY29tCnNlZXNtaWMuY29t +Cnx8c2VldnBuLmNvbQp8fHNlZXpvbmUubmV0CnNlamllLmNvbQouc2VuZHNwYWNl +LmNvbQp8aHR0cDovL3R3ZWV0cy5zZXJhcGgubWUvCnNlc2F3ZS5uZXQKfHxzZXNh +d2UubmV0Ci5zZXNhd2Uub3JnCnx8c2V0aHdrbGVpbi5uZXQKLnNldG4uY29tCi5z +ZXR0di5jb20udHcKZm9ydW0uc2V0dHkuY29tLnR3Ci5zZXZlbmxvYWQuY29tCnx8 +c2V2ZW5sb2FkLmNvbQouc2V4LmNvbQouc2V4LTExLmNvbQp8fHNleDMuY29tCnx8 +c2V4OC5jYwouc2V4YW5kc3VibWlzc2lvbi5jb20KLnNleGJvdC5jb20KLnNleGh1 +LmNvbQouc2V4aHVhbmcuY29tCnNleGluc2V4Lm5ldAp8fHNleGluc2V4Lm5ldAou +c2V4dHZ4LmNvbQoKIS0tSVAgb2YgU2V4SW5TZXgKNjcuMjIwLjkxLjE1CjY3LjIy +MC45MS4xOAo2Ny4yMjAuOTEuMjMKCnxodHRwOi8vKi5zZi5uZXQKLnNmaWxleWR5 +LmNvbQp8fHNmc2hpYmFvLmNvbQouc2Z0aW5kaWEub3JnCi5zZnR1ay5vcmcKfHxz +ZnR1ay5vcmcKfHxzaGFkZXlvdXZwbi5jb20Kc2hhZG93Lm1hCi5zaGFkb3dza3ku +eHl6Ci5zaGFkb3dzb2Nrcy5hc2lhCnx8d3d3LnNoYWRvd3NvY2tzLmNvbQouc2hh +ZG93c29ja3MuY29tCnx8c2hhZG93c29ja3MuY29tLmhrCi5zaGFkb3dzb2Nrcy5v +cmcKfHxzaGFkb3dzb2Nrcy5vcmcKfHxzaGFkb3dzb2Nrcy1yLmNvbQp8aHR0cDov +L2NuLnNoYWZhcW5hLmNvbQouc2hhbWJhbGFwb3N0LmNvbQouc2hhbWJoYWxhc3Vu +LmNvbQouc2hhbmdmYW5nLm9yZwp8fHNoYW5nZmFuZy5vcmcKc2hhcGVzZXJ2aWNl +cy5jb20KLnNoYXJlYmVlLmNvbQp8fHNoYXJlY29vbC5vcmcKIS0tfHxzaGFya2Rv +bHBoaW4uY29tCnNoYXJwZGFpbHkuY29tLmhrCnx8c2hhcnBkYWlseS5jb20uaGsK +LnNoYXJwZGFpbHkuaGsKLnNoYXJwZGFpbHkudHcKLnNoYXQtdGliZXQuY29tCnNo +ZWlreWVybWFtaS5jb20KLnNoZWxsZmlyZS5kZQp8fHNoZWxsZmlyZS5kZQouc2hl +bnNob3Uub3JnCnNoZW55dW4uY29tCnNoZW55dW5wZXJmb3JtaW5nYXJ0cy5vcmcK +fHxzaGVueXVucGVyZm9ybWluZ2FydHMub3JnCnNoZW56aG91ZmlsbS5jb20KfHxz +aGVuemhvdWZpbG0uY29tCnx8c2hlcmFiZ3lhbHRzZW4uY29tCi5zaGlhdHYubmV0 +Ci5zaGljaGVuZy5vcmcKc2hpbnljaGFuLmNvbQpzaGlwY2Ftb3VmbGFnZS5jb20K +LnNoaXJleWlzaHVuamlhbi5jb20KLnNoaXRhb3R2Lm9yZwp8fHNoaXhpYW8ub3Jn +Cnx8c2hpemhhby5vcmcKc2hpemhhby5vcmcKc2hrc3ByLm1vYmkvZGFicgp8fHNo +b2RhbmhxLmNvbQp8fHNob29zaHRpbWUuY29tCi5zaG9wMjAwMC5jb20udHcKLnNo +b3BwaW5nLmNvbQouc2hvd2hhb3R1LmNvbQouc2hvd3RpbWUuanAKLnNodXR0ZXJz +dG9jay5jb20KfHxzaHV0dGVyc3RvY2suY29tCmNoLnNodm9vbmcuY29tCi5zaHdj +aHVyY2gub3JnCnx8d3d3LnNod2NodXJjaC5vcmcKLnNod2NodXJjaDMuY29tCnxo +dHRwOi8vc2h3Y2h1cmNoMy5jb20KLnNpZGRoYXJ0aGFzaW50ZW50Lm9yZwp8fHNp +ZGVsaW5lc25ld3MuY29tCi5zaWRlbGluZXNzcG9ydHNlYXRlcnkuY29tCi5zaWpp +aHVpc3VvLmNsdWIKLnNpamlodWlzdW8uY29tCi5zaWxrYm9vay5jb20KfHxzaW1i +b2xvc3R3aXR0ZXIuY29tCnNpbXBsZWNkLm9yZwp8fHNpbXBsZWNkLm9yZwpAQHx8 +c2ltcGxlY2QubWUKc2ltcGxlcHJvZHVjdGl2aXR5YmxvZy5jb20KYmJzLnNpbmEu +Y29tLwpiYnMuc2luYS5jb20lMkYKYmxvZy5zaW5hLmNvbS50dwpkYWlseW5ld3Mu +c2luYS5jb20vCmRhaWx5bmV3cy5zaW5hLmNvbSUyRgpmb3J1bS5zaW5hLmNvbS5o +awpob21lLnNpbmEuY29tCnx8bWFnYXppbmVzLnNpbmEuY29tLnR3Cm5ld3Muc2lu +YS5jb20uaGsKbmV3cy5zaW5hLmNvbS50dwpuZXdzLnNpbmNoZXcuY29tLm15Ci5z +aW5jaGV3LmNvbS5teS9ub2RlLwouc2luY2hldy5jb20ubXkvdGF4b25vbXkvdGVy +bQouc2luZ2Fwb3JlcG9vbHMuY29tLnNnCnx8c2luZ2Fwb3JlcG9vbHMuY29tLnNn +Ci5zaW5nZm9ydGliZXQuY29tCi5zaW5ncGFvLmNvbS5oawpzaW5ndGFvLmNvbQp8 +fHNpbmd0YW8uY29tCm5ld3Muc2luZ3Rhby5jYQouc2luZ3Rhb3VzYS5jb20KfHxz +aW5ndGFvdXNhLmNvbQohLS18fGNkcC5zaW5pY2EuZWR1LnR3CnNpbm8tbW9udGhs +eS5jb20KfHxzaW5vY2FzdC5jb20Kc2lub2Npc20uY29tCnNpbm9tb250cmVhbC5j +YQouc2lub25ldC5jYQouc2lub3BpdHQuaW5mbwouc2lub2FudHMuY29tCnx8c2lu +b2FudHMuY29tCi5zaW5vcXVlYmVjLmNvbQouc2llcnJhZnJpZW5kc29mdGliZXQu +b3JnCnNpcy54eHgKfHxzaXMwMDEuY29tCnNpczAwMS51cwouc2l0ZTJ1bmJsb2Nr +LmNvbQp8fHNpdGU5MC5uZXQKLnNpdGVicm8udHcKfHxzaXRla3JlYXRvci5jb20K +fHxzaXRla3MudWsudG8KfHxzaXRlbWFwcy5vcmcKLnNqcnQub3JnCnxodHRwOi8v +c2pydC5vcmcKfHxzanVtLmNuCnx8c2tldGNoYXBwc291cmNlcy5jb20KfHxza2lt +dHViZS5jb20KfHxza3liZXQuY29tCnxodHRwOi8vdXNlcnMuc2t5bmV0LmJlL3Jl +dmVzL3RpYmV0aG9tZS5odG1sCi5za3lraW5nLmNvbS50dwpiYnMuc2t5a2l3aS5j +b20KfGh0dHA6Ly93d3cuc2t5cGUuY29tL2ludGwvCnxodHRwOi8vd3d3LnNreXBl +LmNvbS96aC1IYW50Cnx8c2t5dmVnYXMuY29tCi54c2t5d2Fsa2VyLmNvbQp8fHhz +a3l3YWxrZXIuY29tCnx8c2t5eHZwbi5jb20KbS5zbGFuZHIubmV0Ci5zbGF5dGl6 +bGUuY29tCi5zbGVhenlkcmVhbS5jb20KfHxzbGhlbmcuY29tCnx8c2xpZGVzaGFy +ZS5uZXQKZm9ydW0uc2xpbWUuY29tLnR3Ci5zbGlua3NldC5jb20KfHxzbGlja3Zw +bi5jb20KLnNsdXRsb2FkLmNvbQp8fHNtYXJ0ZG5zcHJveHkuY29tCi5zbWFydGhp +ZGUuY29tCnNtY2hib29rcy5jb20KLnNtaC5jb20uYXUvd29ybGQvZGVhdGgtb2Yt +Y2hpbmVzZS1wbGF5Ym95LWxlYXZlcy1mcmVzaC1zY3JhdGNoZXMtaW4tcGFydHkt +cGFpbnR3b3JrLTIwMTIwOTAzLTI1YTh2CnNtaHJpYy5vcmcKLnNtaXRoLmVkdS9k +YWxhaWxhbWEKLnNteXh5Lm9yZwohLS1UT0RPLW5vLWhvbWVwYWdlCnx8c25hcGNo +YXQuY29tCi5zbmFwdHUuY29tCnx8c25hcHR1LmNvbQp8fHNuZGNkbi5jb20Kc25l +YWttZS5uZXQKc25vd2xpb25wdWIuY29tCmhvbWUuc28tbmV0Lm5ldC50dy95aXNh +X3RzYWkKfHxzb2MubWlsCi5zb2Nrc2NhcDY0LmNvbQp8fHNvY2tzbGlzdC5uZXQK +LnNvY3JlYy5vcmcKfGh0dHA6Ly9zb2NyZWMub3JnCi5zb2QuY28uanAKLnNvZnRl +dGhlci5vcmcKfHxzb2Z0ZXRoZXIub3JnCi5zb2Z0ZXRoZXItZG93bmxvYWQuY29t +Cnx8c29mdGV0aGVyLWRvd25sb2FkLmNvbQp8fGNkbi5zb2Z0bGF5ZXIubmV0Cnx8 +c29nY2x1Yi5jb20Kc29oY3JhZGlvLmNvbQp8fHNvaGNyYWRpby5jb20KLnNva21p +bC5jb20KfHxzb3J0aW5nLWFsZ29yaXRobXMuY29tCi5zb3N0aWJldC5vcmcKLnNv +dW1vLmluZm8KfHxzb3VwLmlvCkBAfHxzdGF0aWMuc291cC5pbwouc29iZWVzLmNv +bQp8fHNvYmVlcy5jb20Kc29jaWFsd2hhbGUuY29tCi5zb2Z0ZXRoZXIuY28uanAK +fHxzb2Z0d2FyZWJ5Y2h1Y2suY29tCmJsb2cuc29nb28ub3JnCnNvaC50dwp8fHNv +aC50dwpzb2hmcmFuY2Uub3JnCnx8c29oZnJhbmNlLm9yZwpjaGluZXNlLnNvaWZp +bmQuY29tCnNva2Ftb25saW5lLmNvbQouc29saWRhcml0ZXRpYmV0Lm9yZwouc29s +aWRmaWxlcy5jb20KfHxzb21lZS5jb20KLnNvbmdqaWFuanVuLmNvbQp8fHNvbmdq +aWFuanVuLmNvbQouc29uaWNiYnMuY2MKLnNvbmlkb2RlbGFlc3BlcmFuemEub3Jn +Ci5zb3BjYXN0LmNvbQouc29wY2FzdC5vcmcKLnNvcmF6b25lLm5ldAp8fHNvcy5v +cmcKYmJzLnNvdS10b25nLm9yZwouc291Ym9yeS5jb20KfGh0dHA6Ly9zb3Vib3J5 +LmNvbQouc291bC1wbHVzLm5ldAouc291bGNhbGlidXJoZW50YWkubmV0Cnx8c291 +bGNhbGlidXJoZW50YWkubmV0Cnx8c291bmRjbG91ZC5jb20KIS0tfGh0dHBzOi8v +c291bmRjbG91ZC5jb20vcHVua2dvZAouc291bmRvZmhvcGUua3IKc291bmRvZmhv +cGUub3JnCnx8c291bmRvZmhvcGUub3JnCnx8c291cG9mbWVkaWEuY29tCiEtLS5z +b3VyY2Vmb3JnZS5uZXQKIS18aHR0cDovL3NvdXJjZWZvcmdlLm5ldAp8aHR0cDov +L3NvdXJjZWZvcmdlLm5ldC9wKi9zaGFkb3dzb2Nrc2d1aS8KLnNvdXJjZXdhZGlv +LmNvbQpzb3V0aG5ld3MuY29tLnR3CnNvd2Vycy5vcmcuaGsKfHx3bHguc293aWtp +Lm5ldAp8fHNwYW5rYmFuZy5jb20KLnNwYW5raW5ndHViZS5jb20KLnNwYW5rd2ly +ZS5jb20KfHxzcGIuY29tCnx8c3BlYWtlcmRlY2suY29tCnx8c3BlZWRpZnkuY29t +CnNwZW0uYXQKfHxzcGVuY2VydGlwcGluZy5jb20KfHxzcGljZXZwbi5jb20KLnNw +aWRlcm9hay5jb20KfHxzcGlkZXJvYWsuY29tCi5zcGlrZS5jb20KLnNwb3RmbHV4 +LmNvbQp8fHNwb3RmbHV4LmNvbQouc3ByaW5nNHUuaW5mbwp8aHR0cDovL3Nwcmlu +ZzR1LmluZm8KfHxzcHJvdXRjb3JlLmNvbQp8fHNwcm94eS5pbmZvCnx8c3JvY2tl +dC51cwouc3MtbGluay5jb20KfHxzcy1saW5rLmNvbQouc3NnbG9iYWwuY28vd3AK +fGh0dHA6Ly9zc2dsb2JhbC5jbwouc3NnbG9iYWwubWUKfHxzc2g5MS5jb20KLnNz +cHJvLm1sCnxodHRwOi8vc3Nwcm8ubWwKfHxzc3MuY2FtcAohLS18aHR0cDovL2Nk +bi5zc3RhdGljLm5ldC8KfHxzc3RtbHQubW9lCnNzdG1sdC5uZXQKfHxzc3RtbHQu bmV0CnxodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vdXNlcnMvODk1MjQ1Ci5zdGFn ZTY0LmhrCnx8c3RhZ2U2NC5oawp8fHN0YW5kdXBmb3J0aWJldC5vcmcKc3RhbmZv cmQuZWR1L2dyb3VwL2ZhbHVuCnVzaW5mby5zdGF0ZS5nb3YKfHxzdGF0dWVvZmRl bW9jcmFjeS5vcmcKLnN0YXJmaXNoZnguY29tCi5zdGFycDJwLmNvbQp8fHN0YXJw -MnAuY29tCi5zdGFydHBhZ2UuY29tCnx8c3RhcnRwYWdlLmNvbQouc3RhdGUxNjgu -Y29tCnx8c3RhdGljLWVjb25vbWlzdC5jb20KfHxzdGMuY29tLnNhCnN0ZWFtY29t -bXVuaXR5LmNvbS9ncm91cHMvTGliZXRUaWJldApzdGVhbWNvbW11bml0eS5jb20v -aWQvQ0pUX0phY2t0b24KfHxzdGVlbC1zdG9ybS5jb20KLnN0ZXBjaGluYS5jb20K -IS0tfHxzdGVwbWFuaWEuY29tCm55LnN0Z2xvYmFsbGluay5jb20KaGQuc3RoZWFk -bGluZS5jb20vbmV3cy9yZWFsdGltZQpzdGhvby5jb20KfHxzdGhvby5jb20KLnN0 -aWNrYW0uY29tCnN0aWNrZXJhY3Rpb24uY29tL3Nlc2F3ZQouc3RpbGVwcm9qZWN0 -LmNvbQouc3RvLmNjCnx8c3RvbmVpcC5pbmZvCnx8c3RvcmFnZW5ld3NsZXR0ZXIu -Y29tCi5zdG9ybS5tZwp8fHN0b3JtLm1nCi5zdG9wdGliZXRjcmlzaXMubmV0Cnx8 -c3RvcHRpYmV0Y3Jpc2lzLm5ldAp8fHN0b3JpZnkuY29tCi5zdG9ybW1lZGlhZ3Jv -dXAuY29tCnx8c3Rvd2Vib3lkLmNvbQpzdHJhbmFiZy5jb20KfHxzdHJlYW1pbmd0 -aGUubmV0CnN0cmVlbWEuY29tL3R2L05URFRWX0NoaW5lc2UKY24uc3RyZWV0dm9p -Y2UuY29tL2FydGljbGUKY24uc3RyZWV0dm9pY2UuY29tL2RpYXJ5CmNuMi5zdHJl -ZXR2b2ljZS5jb20KdHcuc3RyZWV0dm9pY2UuY29tCnx8c3Ryb25ndnBuLmNvbQou -c3Ryb25nd2luZHByZXNzLmNvbQouc3R1ZGVudC50dy9kYgp8fHN0dWRlbnRzZm9y -YWZyZWV0aWJldC5vcmcKfHxzdHVtYmxldXBvbi5jb20Kc3R1cGlkdmlkZW9zLmNv -bQpwYW5hbWFwYXBlcnMuc3VlZGRldXRzY2hlLmRlCi5zdWdhcnN5bmMuY29tCnx8 -c3VnYXJzeW5jLmNvbQouc3Vnb2Jicy5jb20KfHxzdWlzc2wuY29tCnN1bW1pZnku -Y29tCi5zdW1yYW5kby5jb20KfHxzdW1yYW5kby5jb20Kc3VuMTkxMS5jb20KLnN1 -bnBvcm5vLmNvbQp8fHN1bm1lZGlhLmNhCnx8c3VucG9ybm8uY29tCi5zdW5za3lm -b3J1bS5jb20KLnN1bnZwbi5uZXQKLnN1b2x1by5vcmcKLnN1cGVydnBuLm5ldAp8 -fHN1cGVydnBuLm5ldAouc3VwcmVtZW1hc3RlcnR2LmNvbQp8aHR0cDovL3N1cHJl -bWVtYXN0ZXJ0di5jb20KLnN1cmZlYXN5LmNvbQp8fHN1cmZlYXN5LmNvbQouc3Vy -ZmVhc3kuY29tLmF1CnxodHRwOi8vc3VyZmVhc3kuY29tLmF1Cnx8c3VycmVuZGVy -YXQyMC5uZXQKLnN1eWFuZ2cuY29tCnxodHRwOi8vc3V5YW5nZy5jb20KfHxzdndp -bmQuY29tCnx8c3dldXguY29tCi5zd2lzc3Zwbi5uZXQKfHxzd2lzc3Zwbi5uZXQK -c3dpdGNodnBuLm5ldAp8fHN3aXRjaHZwbi5uZXQKfHxzd2lmdC10b29scy5uZXQK -LnN5ZG5leXRvZGF5LmNvbQouc3lsZm91bmRhdGlvbi5vcmcKfHxzeW5jYmFjay5j -b20KfHxzeXNhZG1pbjExMzgubmV0CnN5c3Jlc2NjZC5vcmcKLnN5dGVzLm5ldApi -bG9nLnN5eDg2LmNvbS8yMDA5LzA5L3B1ZmYKYmxvZy5zeXg4Ni5jbi8yMDA5LzA5 -L3B1ZmYKLnN6YmJzLm5ldAp8fHN6ZXRvd2FoLm9yZy5oawoKIS0tLS0tLS0tLS0t -LS0tLS0tLS0tVFQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi50MzUuY29tCi50 -NjZ5LmNvbQp8fHQ2NnkuY29tCnx8dDg4LmNhCi50YWEtdXNhLm9yZwp8aHR0cDov -L3RhYS11c2Eub3JnCi50YWF6ZS50dwp8fHRhYXplLnR3CnxodHRwOi8vd3d3LnRh -Ymxlc2dlbmVyYXRvci5jb20vCnRhYnR0ZXIuanAKLnRhY2VtLm9yZwoudGFjb25l -dC5jb20udHcKfHx0YWVkcC5vcmcudHcKfHx0YWZhd2FyZC5jb20KLnRhZm0ub3Jn -Ci50YWd3YS5vcmcuYXUKdGFnd2Fsay5jb20KfHx0YWd3YWxrLmNvbQp0YWhyLm9y -Zy50dwoudGFpcGVpc29jaWV0eS5vcmcKfHx0YWlwZWlzb2NpZXR5Lm9yZwoudGFp -d2FuYmlibGUuY29tCi50YWl3YW5jb24uY29tCi50YWl3YW5kYWlseS5uZXQKfHx0 -YWl3YW5kYWlseS5uZXQKLnRhaXdhbmRjLm9yZwp8fHRhaXdhbmVtYmFzc3kub3Jn -Ci50YWl3YW5qdXN0aWNlLmNvbQp0YWl3YW5raXNzLmNvbQp0YWl3YW5uYXRpb24u -Y29tCnRhaXdhbm5hdGlvbi5jb20udHcKfHx0YWl3YW5uY2Yub3JnLnR3Cnx8dGFp -d2FubmV3cy5jb20udHcKfGh0dHA6Ly93d3cudGFpd2Fub25saW5lLmNjLwp8fHRh -aXdhbnRvZGF5LnR3CnRhaXdhbnRwLm5ldAp8fHRhaXdhbnR0Lm9yZy50dwp0YWl3 -YW51cy5uZXQKdGFpd2FueWVzLmNvbQp0YWl3YW4tc2V4LmNvbQoudGFsazg1My5j -b20KLnRhbGtib3hhcHAuY29tCnx8dGFsa2JveGFwcC5jb20KLnRhbGtvbmx5Lm5l -dAp8fHRhbGtvbmx5Lm5ldAp8fHRhbWlhb2RlLnRrCnx8dGFuYy5vcmcKdGFuZ2Jl -bi5jb20KLnRhbmdyZW4udXMKLnRhb2lzbS5uZXQKfGh0dHA6Ly90YW9pc20ubmV0 -Ci50YW9sdW4uaW5mbwp8fHRhb2x1bi5pbmZvCi50YXBhdGFsay5jb20KfHx0YXBh -dGFsay5jb20KYmxvZy50YXJhZ2FuYS5jb20KLnRhc2NuLmNvbS5hdQp8fHRhdXAu -bmV0CnxodHRwOi8vd3d3LnRhdXAub3JnLnR3Ci50YXdlZXQuY29tCnx8dGF3ZWV0 -LmNvbQoudGJjb2xsZWdlLm9yZwp8fHRiY29sbGVnZS5vcmcKLnRiaS5vcmcuaGsK -LnRiaWNuLm9yZwoudGJqeXQub3JnCnx8dGJwaWMuaW5mbwp0YnMtcmFpbmJvdy5v -cmcKfHx0YnNlYy5vcmcKdGJza2tpbmFiYWx1LnBhZ2UudGwKLnRic21hbGF5c2lh -Lm9yZwoudGJzbi5vcmcKfHx0YnNuLm9yZwoudGJzc2VhdHRsZS5vcmcKLnRic3Nx -aC5vcmcKfGh0dHA6Ly90YnNzcWgub3JnCnRic3dkLm9yZwoudGJ0ZW1wbGUub3Jn -LnVrCi50YnRob3VzdG9uLm9yZwoudGNjd29ubGluZS5vcmcKLnRjZXdmLm9yZwp0 -Y2hyZC5vcmcKdGNueW5qLm9yZwoudGNzb2ZiYy5vcmcKLnRjc292aS5vcmcKdGVh -bWFtZXJpY2FueS5jb20KfHx0ZWNobGlmZXdlYi5jb20KIS0tdGVjaG5vcmF0aS5j -b20KfHx0ZWNrLmluCi50ZWVuaWVmdWNrLm5ldAp0ZWVuc2luYXNpYS5jb20KLnRl -bGVjb21zcGFjZS5jb20KfHx0ZWxlZ3JhbS5vcmcKLnRlbGVncmFtZG93bmxvYWQu -Y29tCnx8dGVsZWdyYXBoLmNvLnVrCi50ZW5hY3kuY29tCi50ZXcub3JnCi50aGFp -Y24uY29tCnx8dGhlYXRydW0tYmVsbGkuY29tCnx8dGhlYm9keXNob3AtdXNhLmNv -bQp0aGVibGVtaXNoLmNvbQp8fHRoZWJjb21wbGV4LmNvbQoudGhlYm9icy5jb20K -fHx0aGVib2JzLmNvbQoudGhlY2hpbmFiZWF0Lm9yZwp8aHR0cDovL3d3dy50aGVj -aGluYXN0b3J5Lm9yZy95ZWFyYm9va3MveWVhcmJvb2stMjAxMi8KLnRoZWRhbGFp -bGFtYW1vdmllLmNvbQp8aHR0cDovL3RoZWRhbGFpbGFtYW1vdmllLmNvbQp8fHRo -ZWR3LnVzCnRoZWZyb250aWVyLmhrL3RmCiEtLXx8dGhlZ2F0ZXNub3Rlcy5jb20K -fGh0dHA6Ly90aGVnaW9pdGluaG9jLnZuLwoudGhlZ2x5LmNvbQoudGhlaG90cy5p -bmZvCnRoZWhvdXNlbmV3cy5jb20KfHx0aGVodW4ubmV0Ci50aGVpbml0aXVtLmNv -bQp8fHRoZWluaXRpdW0uY29tCnx8dGhlbGlmZXlvdWNhbnNhdmUuY29tCi50aGVu -ZXdzbGVucy5jb20KfHx0aGVuZXdzbGVucy5jb20KLnRoZXBpcmF0ZWJheS5vcmcK -fHx0aGVwaXJhdGViYXkub3JnCiEtLXx8dGhlcGlyYXRlYmF5LnNlCnx8dGhlcG9y -dGFsd2lraS5jb20KdGhlcmVhbGxvdmUua3IKdGhlcm9jay5uZXQubnoKdGhlc3Bl -ZWRlci5jb20KfHx0aGVzdGFuZG5ld3MuY29tCnRoZXRpYmV0Y2VudGVyLm9yZwp0 -aGV0aWJldGNvbm5lY3Rpb24ub3JnCi50aGV0aWJldG11c2V1bS5vcmcKLnRoZXRp -YmV0cG9zdC5jb20KfHx0aGV0aWJldHBvc3QuY29tCnRoZXRyb3Rza3ltb3ZpZS5j -b20KdGhldml2ZWtzcG90LmNvbQp8fHRoZXdnby5vcmcKLnRoaW5raW5ndGFpd2Fu -LmNvbQoudGhpc2F2LmNvbQp8aHR0cDovL3RoaXNhdi5jb20KLnRobGliLm9yZwp8 -fHRob21hc2Jlcm5oYXJkLm9yZwp0aHJlYXRjaGFvcy5jb20KfHx0aHJvdWdobmln -aHRzZmlyZS5jb20KLnRodW1iemlsbGEuY29tCnx8dGh5d29yZHMuY29tCi50aHl3 -b3Jkcy5jb20udHcKdGlhbmFubWVubW90aGVyLm9yZwoudGlhbmFubWVuZHVpemhp -LmNvbQp8fHRpYW5hbm1lbmR1aXpoaS5jb20KfHx0aWFuYW5tZW51bml2LmNvbQp8 -fHRpYW5hbm1lbnVuaXYubmV0Cnx8dGlhbmRpeGluZy5vcmcKLnRpYW5odWF5dWFu -LmNvbQoudGlhbmxhd29mZmljZS5jb20KfHx0aWFudGkuaW8KdGlhbnRpYm9va3Mu -b3JnCi50aWFuemh1Lm9yZwoudGliZXQuYXQKdGliZXQuY2EKLnRpYmV0LmNvbQp8 -fHRpYmV0LmNvbQp0aWJldC5mcgoudGliZXQubmV0Cnx8dGliZXQubmV0CnRpYmV0 -Lm51Ci50aWJldC5vcmcKfHx0aWJldC5vcmcKdGliZXQub3JnLnR3Ci50aWJldC50 -bwoudGliZXQtZW52b3kuZXUKfHx0aWJldC1lbnZveS5ldQoudGliZXQtZm91bmRh -dGlvbi5vcmcKLnRpYmV0LWhvdXNlLXRydXN0LmNvLnVrCnRpYmV0LWluZm8ubmV0 -CnRpYmV0LWluaXRpYXRpdmUuZGUKIS0tfHx0aWJldC1pbml0aWF0aXZlLmRlCi50 -aWJldC1tdW5pY2guZGUKLnRpYmV0M3JkcG9sZS5vcmcKfGh0dHA6Ly90aWJldDNy -ZHBvbGUub3JnCnRpYmV0YWN0aW9uLm5ldAp8fHRpYmV0YWN0aW9uLm5ldAoudGli -ZXRhaWQub3JnCnRpYmV0YWxrLmNvbQoudGliZXRhbi5mcgp0aWJldGFuLWFsbGlh -bmNlLm9yZwoudGliZXRhbmFydHMub3JnCi50aWJldGFuYnVkZGhpc3RpbnN0aXR1 -dGUub3JnCnxodHRwOi8vdGliZXRhbmJ1ZGRoaXN0aW5zdGl0dXRlLm9yZwoudGli -ZXRhbmxhbmd1YWdlLm9yZwoudGliZXRhbmxpYmVyYXRpb24ub3JnCnx8dGliZXRh -bmxpYmVyYXRpb24ub3JnCi50aWJldGNvbGxlY3Rpb24uY29tCi50aWJldGFuYWlk -cHJvamVjdC5vcmcKLnRpYmV0YW5jb21tdW5pdHl1ay5uZXQKfGh0dHA6Ly90aWJl -dGFuY29tbXVuaXR5dWsubmV0CnRpYmV0YW5jdWx0dXJlLm9yZwp0aWJldGFuZmVt -aW5pc3Rjb2xsZWN0aXZlLm9yZwoudGliZXRhbnBhaW50aW5ncy5jb20KLnRpYmV0 -YW5waG90b3Byb2plY3QuY29tCi50aWJldGFucG9saXRpY2FscmV2aWV3Lm9yZwou -dGliZXRhbnJldmlldy5uZXQKLnRpYmV0YW53b21lbi5vcmcKfGh0dHA6Ly90aWJl -dGFud29tZW4ub3JnCi50aWJldGFueW91dGgub3JnCi50aWJldGFueW91dGhjb25n -cmVzcy5vcmcKfHx0aWJldGFueW91dGhjb25ncmVzcy5vcmcKLnRpYmV0Y2hhcml0 -eS5kawp0aWJldGNoYXJpdHkuaW4KLnRpYmV0Y2hpbGQub3JnCi50aWJldGNpdHku -Y29tCi50aWJldGNvcnBzLm9yZwoudGliZXRleHByZXNzLm5ldAp8aHR0cDovL3Rp -YmV0ZXhwcmVzcy5uZXQKdGliZXRmb2N1cy5jb20KdGliZXRmdW5kLm9yZwoudGli -ZXRnZXJtYW55LmNvbQp8fHRpYmV0Z2VybWFueS5kZQoudGliZXRoYXVzLmNvbQou -dGliZXRoZXJpdGFnZWZ1bmQub3JnCnRpYmV0aG91c2UuanAKdGliZXRob3VzZS5v -cmcKfHx0aWJldGhvdXNlLnVzCi50aWJldGluZm9uZXQubmV0Ci50aWJldGp1c3Rp -Y2Uub3JnCi50aWJldGtvbWl0ZS5kawp8aHR0cDovL3RpYmV0bXVzZXVtLm9yZwp0 -aWJldG5ldHdvcmsub3JnCnx8dGliZXRuZXR3b3JrLm9yZwoudGliZXRvZmZpY2Uu -Y2gKfGh0dHA6Ly90aWJldG9mZmljZS5jaAp0aWJldG9mZmljZS5ldQp0aWJldG9m -ZmljZS5vcmcKdGliZXRvbmxpbmUuY29tCnx8dGliZXRvbmxpbmUuY29tCi50aWJl -dG9mZmljZS5jb20uYXUKfGh0dHA6Ly90aWJldG9mZmljZS5jb20uYXUKfHx0aWJl -dG9ubGluZS50dgoudGliZXRvbmxpbmUudHYKLnRpYmV0b3JhbGhpc3Rvcnkub3Jn -CnxodHRwOi8vdGliZXRvcmFsaGlzdG9yeS5vcmcKLnRpYmV0cG9saWN5LmV1Ci50 -aWJldHJlbGllZmZ1bmQuY28udWsKdGliZXRzaXRlcy5jb20KLnRpYmV0c29jaWV0 -eS5jb20KfHx0aWJldHNvY2lldHkuY29tCi50aWJldHN1bi5jb20KLnRpYmV0c3Vw -cG9ydGdyb3VwLm9yZwp8aHR0cDovL3RpYmV0c3VwcG9ydGdyb3VwLm9yZwoudGli -ZXRzd2lzcy5jaAoudGliZXR0ZWxlZ3JhcGguY29tCnRpYmV0dGltZXMubmV0Cnx8 -dGliZXR3cml0ZXMub3JnCi50aWNrZXQuY29tLnR3Ci50aW1kaXIuY29tCnxodHRw -Oi8vdGltZGlyLmNvbQoudGltZS5jb20KfGh0dHA6Ly90aW1lLmNvbQohLS0udGlt -ZS5jb20vdGltZS90aW1lMTAwL2xlYWRlcnMvcHJvZmlsZS9yZWJlbAohLS0udGlt -ZS5jb20vdGltZS9zcGVjaWFscy9wYWNrYWdlcy9hcnRpY2xlLzAsMjg4MDQKIS0t -LnRpbWUuY29tL3RpbWUvbWFnYXppbmUKLnRpbXNhaC5jb20KfHxibG9nLnRpbmV5 -LmNvbQp0aW50dWMxMDEuY29tCi50aW55LmNjCnxodHRwOi8vdGlueS5jYwp0aW55 -Y2hhdC5jb20KfHx0aW55cGFzdGUuY29tCi50aXN0b3J5LmNvbQp8fHRrY3MtY29s -bGlucy5jb20KLnRtYWdhemluZS5jb20KfHx0bWFnYXppbmUuY29tCi50bWRmaXNo -LmNvbQp8aHR0cDovL3RtaS5tZQoudG1wcC5vcmcKfGh0dHA6Ly90bXBwLm9yZwou -dG5hZmxpeC5jb20KfHx0bmFmbGl4LmNvbQoudG5ncm5vdy5jb20KLnRuZ3Jub3cu -bmV0Ci50bnAub3JnCnxodHRwOi8vdG5wLm9yZwoudG8tcG9ybm8uY29tCnx8dG8t -cG9ybm8uY29tCnRvZ2V0dGVyLmNvbQoudG9reW8tMjQ3LmNvbQoudG9reW8taG90 -LmNvbQp8fHRva3lvLXBvcm4tdHViZS5jb20KfHx0b2t5b2NuLmNvbQp0dy50b21v -bmV3cy5uZXQKLnRvbmdpbC5vci5rcgoudG9uby1va2EuanAKdG9ueXlhbi5uZXQK -LnRvb2RvYy5jb20KdG9vbmVsLm5ldAp0b3A4MS53cwoudG9wbmV3cy5pbgp8fHRv -cHNoYXJlLnVzCi50b3JndWFyZC5uZXQKfHx0b3JndWFyZC5uZXQKLnRvcHNoYXJl -d2FyZS5jb20KLnRvcHN5LmNvbQp8fHRvcHN5LmNvbQp8fHRvcHRpcC5jYQp0b3Jh -LnRvCi50b3Jjbi5jb20KLnRvcnByb2plY3Qub3JnCnx8dG9ycHJvamVjdC5vcmcK -dG9ycmVudGNyYXp5LmNvbQp8fHRvcnJlbnRjcmF6eS5jb20KdG9ycmVudHByaXZh -Y3kuY29tCnx8dG9ycmVudHByaXZhY3kuY29tCnxodHRwOi8vdG9ycmVudHByb2pl -Y3Quc2UKfHx0b3JyZW50eS5vcmcKfHx0b3JyZW50ei5ldQp8fHRvcnZwbi5jb20K -fHx0b3RhbHZwbi5jb20KfHx0b3V0ZnIuY29tCnRvd25nYWluLmNvbQp0b3lwYXJr -LmluCnRveXRyYWN0b3JzaG93LmNvbQoudHBhcmVudHMub3JnCi50cGkub3JnLnR3 -Cnx8dHBpLm9yZy50dwp0cmFmZmljaGF1cy5jb20KfHx0cmFuc2dyZXNzaW9uaXNt -Lm9yZwp8fHRyYW5zcGFyZW5jeS5vcmcKfHx0cmF2ZWxpbmxvY2FsLmNvbQp8fHRy -ZWVtYWxsLmNvbS50dwp0cmVuZHNtYXAuY29tCnx8dHJlbmRzbWFwLmNvbQoudHJp -YWxvZmNjcC5vcmcKfHx0cmlhbG9mY2NwLm9yZwoudHJpbW9uZGkuZGUvU0RMRQp8 -fHRyaXBvZC5jb20KQEB8fHd3dy50cmlwb2QuY29tCi50cm91dy5ubAp8aHR0cDov -L3Ryb3V3Lm5sCi50cnQubmV0LnRyCnRydGMuY29tLnR3Ci50cnVlYnVkZGhhLW1k -Lm9yZwp8aHR0cDovL3RydWVidWRkaGEtbWQub3JnCnRydWx5ZXJnb25vbWljLmNv -bQp8fHRydXN0ZWRiaS5jb20KLnRydXRoMTAxLmNvLnR2CnxodHRwOi8vdHJ1dGgx -MDEuY28udHYKfHx0cnV0aGNuLmNvbQoudHJ1dGhvbnRvdXIub3JnCnxodHRwOi8v -dHJ1dGhvbnRvdXIub3JnCi50cnV2ZW8uY29tCi50c2N0di5uZXQKLnRzZW10dWxr -dS5jb20KdHNxdWFyZS50dgoudHN1Lm9yZy50dwp0c3VuYWdhcnVtb24uY29tCiEt -LXxodHRwOi8vd3d3LnRzdXJ1LWJpcmQubmV0LwoudHNjdHYubmV0Cnx8dHQtcnNz -Lm9yZwp8fHR0MTA2OS5jb20KLnR0dGFuLmNvbQp8fHR0dGFuLmNvbQpiYi50dHYu -Y29tLnR3L2JiCnR1ODk2NC5jb20KLnR1YW56dC5jb20KLnR1YmFob2xpYy5jb20K -LnR1YmUuY29tCnR1YmU4LmNvbQp8fHR1YmU4LmNvbQoudHViZTkxMS5jb20KfHx0 -dWJlOTExLmNvbQp0dWJlY2FvLmNvbQoudHViZWN1cC5jb20KLnR1YmVnYWxzLmNv -bQoudHViZWlzbGFtLmNvbQp8aHR0cDovL3R1YmVpc2xhbS5jb20KfHx0dWJld29s -Zi5jb20KdHVpZGFuZy5uZXQKdHVpZGFuZy5vcmcKLnR1aWRhbmcuc2UKYmJzLnR1 -aXR1aS5pbmZvCi50dW11dGFuemkuY29tCnxodHRwOi8vdHVtdXRhbnppLmNvbQou -dHVuZWluLmNvbQp8aHR0cDovL3R1bmVpbi5jb20KfHx0dW5uZWxiZWFyLmNvbQou -dHVvOC5jYwoudHVvOC5jbHViCi50dW84LmZpdAoudHVvOC5oawoudHVvOC5pbgou -dHVvOC5uaW5qYQoudHVvOC5vcmcKfHx0dW84LmZpdAp8fHR1bzgub3JnCi50dW84 -LnB3CnxodHRwOi8vdHVvOC5wdwp0dWl0d2l0LmNvbQoudHVyYW5zYW0ub3JnCi50 -dXJib2JpdC5uZXQKfGh0dHA6Ly90dXJib2JpdC5uZXQKLnR1cmJvaGlkZS5jb20K -fHx0dXJib2hpZGUuY29tCnx8dHVybmluZ3RvcnNvLmNvbQoudHVzaHljYXNoLmNv -bQp8aHR0cDovL3R1c2h5Y2FzaC5jb20KLnR1dnBuLmNvbQp8fHR1dnBuLmNvbQp8 -fHR1eHRyYWluaW5nLmNvbQp8aHR0cDovL3R1emFpamlkaS5jb20KfGh0dHA6Ly8q -LnR1emFpamlkaS5jb20KLnR3MDEub3JnCnxodHRwOi8vdHcwMS5vcmcKCiEtLS1U -dW1ibHItLS0KLnR1bWJsci5jb20KfHx0dW1ibHIuY29tCiEtLUBAfHxhc3NldHMu -dHVtYmxyLmNvbQohLS1AQHx8ZGF0YS50dW1ibHIuY29tCiEtLUBAfHxtZWRpYS50 -dW1ibHIuY29tCiEtLUBAfHxzdGF0aWMudHVtYmxyLmNvbQohLS1AQHx8d3d3LnR1 -bWJsci5jb20KIS0tYmxvY2tlZG9ud2VpYm8udHVtYmxyLmNvbQohLS18fGZxcm91 -dGVyLnR1bWJsci5jb20KIS0tZmFucWlhbmdrYW4udHVtYmxyLmNvbQohLS1mdWJh -aWNoaW5hLnR1bWJsci5jb20KCi50di5jb20KfGh0dHA6Ly90di5jb20KfHx0di1p -bnRyb3MuY29tCnR2YW50cy5jb20KZm9ydW0udHZiLmNvbQpuZXdzLnR2Yi5jb20v -bGlzdC93b3JsZApuZXdzLnR2Yi5jb20vbG9jYWwKbmV3cy50dmJzLmNvbS50dwou -dHZib3hub3cuY29tCnxodHRwOi8vdHZib3hub3cuY29tLwp0dmlkZXIuY29tCi50 -dm1vc3QuY29tLmhrCi50dnBsYXl2aWRlb3MuY29tCnx8dHZ1bmV0d29ya3MuY29t -Ci50dy1ucG8ub3JnCi50d2FpdHRlci5jb20KdHdhcHBlcmtlZXBlci5jb20KfHx0 -d2FwcGVya2VlcGVyLmNvbQp8fHR3YXVkLmlvCi50d2F1ZC5pbwoudHdiYnMubmV0 -LnR3CnR3YmJzLm9yZwp0d2Jicy50dwp8fHR3YmxvZ2dlci5jb20KdHdlZXBtYWcu -Y29tCi50d2VlcG1sLm9yZwp8fHR3ZWVwbWwub3JnCi50d2VldGJhY2t1cC5jb20K -fHx0d2VldGJhY2t1cC5jb20KdHdlZXRib2FyZC5jb20KfHx0d2VldGJvYXJkLmNv -bQoudHdlZXRib25lci5iaXoKfHx0d2VldGJvbmVyLmJpegoudHdlZXRkZWNrLmNv -bQp8fHR3ZWV0ZGVjay5jb20KfGh0dHA6Ly9kZWNrLmx5CiEtLSBPcGVyYXRpb24g -ZGlzY29udGludWVkCiEtLXx8dHdlZXRlLm5ldAohLS1tLnR3ZWV0ZS5uZXQKfHxt -dHcudGwKfHx0d2VldGVkdGltZXMuY29tCiEtLSBPcGVyYXRpb24gZGlzY29udGlu -dWVkCiEtLXR3ZWV0bWVtZS5jb20KfHx0d2VldG15bGFzdC5mbQp0d2VldHBob3Rv -LmNvbQp8fHR3ZWV0cGhvdG8uY29tCnx8dHdlZXRyYW5zLmNvbQp0d2VldHJlZS5j -b20KfHx0d2VldHJlZS5jb20KLnR3ZWV0dHVubmVsLmNvbQp8fHR3ZWV0dHVubmVs -LmNvbQp8fHR3ZWV0d2FsbHkuY29tCnR3ZWV0eW1haWwuY29tCnx8dHdmdHAub3Jn -CnR3aWJhc2UuY29tCi50d2liYmxlLmRlCnx8dHdpYmJsZS5kZQp0d2liYm9uLmNv -bQp8fHR3aWJzLmNvbQp0d2ljc3kuY29tCi50d2llbmRzLmNvbQp8aHR0cDovL3R3 -aWVuZHMuY29tCi50d2lmYW4uY29tCnxodHRwOi8vdHdpZmFuLmNvbQp0d2lmZm8u -Y29tCnx8dHdpZmZvLmNvbQoudHdpbGlnaHRzZXguY29tCnR3aWxvZy5vcmcKdHdp -bWJvdy5jb20KfHx0d2luZGV4eC5jb20KdHdpcHBsZS5qcAp8fHR3aXBwbGUuanAK -fHx0d2lwLm1lCnR3aXNob3J0LmNvbQp8fHR3aXNob3J0LmNvbQp0d2lzdGFyLmNj -Cnx8dHdpc3Rlci5uZXQuY28KfHx0d2lzdGVyaW8uY29tCnR3aXN0ZXJub3cuY29t -CnR3aXN0b3J5Lm5ldAp0d2l0YnJvd3Nlci5uZXQKfHx0d2l0Y2F1c2UuY29tCnx8 -dHdpdGdldGhlci5jb20KfHx0d2lnZ2l0Lm9yZwp0d2l0Z29vLmNvbQp0d2l0aXEu -Y29tCnx8dHdpdGlxLmNvbQoudHdpdGxvbmdlci5jb20KfHx0d2l0bG9uZ2VyLmNv -bQp8aHR0cDovL3RsLmdkLwp0d2l0bWFuaWEuY29tCnR3aXRvYXN0ZXIuY29tCnx8 -dHdpdG9hc3Rlci5jb20KfHx0d2l0b25tc24uY29tCi50d2l0cGljLmNvbQp8fHR3 -aXRwaWMuY29tCiEtLVNhbWUgSVAKLnR3aXQyZC5jb20KfHx0d2l0MmQuY29tCi50 -d2l0c3RhdC5jb20KfHx0d2l0c3RhdC5jb20KfHxmaXJzdGZpdmVmb2xsb3dlcnMu -Y29tCnx8cmV0d2VldGVmZmVjdC5jb20KfHx0d2VlcGxpa2UubWUKfHx0d2VlcGd1 -aWRlLmNvbQp8fHR1cmJvdHdpdHRlci5jb20KLnR3aXR2aWQuY29tCnx8dHdpdHZp -ZC5jb20KMTk5LjU5LjE0OC4yMAoudC5jbwp8fHQuY28KfGh0dHA6Ly90d3QudGwK -dHdpdHRib3QubmV0Cnx8YWRzLXR3aXR0ZXIuY29tCi50d2l0dGVyLmNvbQp8fHR3 -aXR0ZXIuY29tCnx8dHdpdHRlci5qcAp8fHR3dHRyLmNvbQp8fHR3aXR0ZXI0ai5v -cmcKLnR3aXR0ZXJjb3VudGVyLmNvbQp8fHR3aXR0ZXJjb3VudGVyLmNvbQp0d2l0 -dGVyZmVlZC5jb20KLnR3aXR0ZXJnYWRnZXQuY29tCnx8dHdpdHRlcmdhZGdldC5j -b20KLnR3aXR0ZXJrci5jb20KfHx0d2l0dGVya3IuY29tCnx8dHdpdHRlcm1haWwu -Y29tCnx8dHdpdHRlcnJpZmljLmNvbQp0d2l0dGVydGltLmVzCnx8dHdpdHRlcnRp -bS5lcwp0d2l0dGhhdC5jb20KfHx0d2l0dHVyay5jb20KLnR3aXR0dXJseS5jb20K -fHx0d2l0dHVybHkuY29tCi50d2l0emFwLmNvbQp0d2l5aWEuY29tCnx8dHdzdGFy -Lm5ldAoudHd0a3IuY29tCnxodHRwOi8vdHd0a3IuY29tCnx8dHdpbWcuY29tCi50 -d25vcnRoLm9yZy50dwp0d3NreXBlLmNvbQp0d3RybGFuZC5jb20KdHd1cmwubmwK -LnR3eWFjLm9yZwp8fHR3eWFjLm9yZwoudHh4eC5jb20KLnR5Y29vbC5jb20KfHx0 -eWNvb2wuY29tCnx8dHphbmdtcy5jb20KCiEtLXR5cGVwYWQKfHx0eXBlcGFkLmNv -bQpAQHx8d3d3LnR5cGVwYWQuY29tCkBAfHxzdGF0aWMudHlwZXBhZC5jb20KfHxi -bG9nLmV4cG9mdXR1cmVzLmNvbQp8fGxlZ2FsdGVjaC5sYXcuY29tCnx8YmxvZ3Mu -dGFtcGFiYXkuY29tCnx8Y29udGVzdHMudHdpbGlvLmNvbQohLWxhd3Byb2Zlc3Nv -cnMudHlwZXBhZC5jb20vY2hpbmFfbGF3X3Byb2YKCiEtLS0tLS0tLS0tLS0tVHdp -dGVzZS0tLS0tCi5lbWJyLmluCnx8ZW1ici5pbgoKIS0tLS0tLS0tLS0tLS0tLS0t -LS0tVVUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi51YmRkbnMub3JnCnxodHRw -Oi8vdWJkZG5zLm9yZwp8fHViZXJwcm94eS5uZXQKLnVjLWphcGFuLm9yZwp8fHVj -LWphcGFuLm9yZwouc3JjZi51Y2FtLm9yZy9zYWxvbi8KfGh0dHA6Ly9jaGluYS51 -Y2FuZXdzLmNvbS8KfHx1Y2RjMTk5OC5vcmcKfGh0dHA6Ly9odW0qLnVjaGljYWdv -LmVkdS9mYWN1bHR5L3l3YW5nL2hpc3RvcnkKfHx1ZGVyem8uaXQKLnVkbi5jb20K -fHx1ZG4uY29tCnVkbmJray5jb20vYmJzCnx8dWZvcmFkaW8uY29tLnR3CnVmcmVl -dnBuLmNvbQoudWdvLmNvbQohLS1naHMKfHx1aGR3YWxscGFwZXJzLm9yZwp8fHVo -cnAub3JnCi51aWdodXIubmwKfHx1aWdodXIubmwKdWlnaHVyYml6Lm5ldAoudWxp -a2UubmV0CnVrY2RwLmNvLnVrCnVrbGlmZXJhZGlvLmNvLnVrCnx8dWtsaWZlcmFk -aW8uY28udWsKdWx0cmF2cG4uZnIKfHx1bHRyYXZwbi5mcgp1bHRyYXhzLmNvbQp1 -bWljaC5lZHUvfmZhbHVuCnx8dW5ibG9jay5jbi5jb20KdW5ibG9jay11cy5jb20K -fHx1bmJsb2NrLXVzLmNvbQoudW5ibG9ja2RtbS5jb20KfGh0dHA6Ly91bmJsb2Nr -ZG1tLmNvbQp8fHVuYmxvY2tzaXQuZXMKdW5jeWNsb21lZGlhLm9yZwoudW5jeWNs -b3BlZGlhLmhrL3dpa2kKfGh0dHA6Ly91bmN5Y2xvcGVkaWEuaGsKIS0tdW5jeWNs -b3BlZGlhLmluZm8KfGh0dHA6Ly91bmN5Y2xvcGVkaWEudHcKdW5kZXJ3b29kYW1t -by5jb20KfHx1bmRlcndvb2RhbW1vLmNvbQp8fHVuaG9seWtuaWdodC5jb20KLnVu -aS5jYwp8fGNsZHIudW5pY29kZS5vcmcKLnVuaWZpY2F0aW9uLm5ldAoudW5pZmlj -YXRpb24ub3JnLnR3Ci51bml0ZWRzb2NpYWxwcmVzcy5jb20KLnVuaXgxMDAuY29t -Cnx8dW5rbm93bnNwYWNlLm9yZwoudW5vZGVkb3MuY29tCnVucG8ub3JnCi51bnRy -YWNlYWJsZS51cwp8aHR0cDovL3VudHJhY2VhYmxlLnVzCnx8dW9jbi5vcmcKdG9y -LnVwZGF0ZXN0YXIuY29tCi51cGhvbGRqdXN0aWNlLm9yZwoudXBsb2FkNHUuaW5m -bwp1cGxvYWRlZC5uZXQvZmlsZQp8aHR0cDovL3VwbG9hZGVkLm5ldC9maWxlCnxo -dHRwOi8vdXBsb2FkZWQudG8vZmlsZQoudXBsb2Fkc3RhdGlvbi5jb20vZmlsZQou -dXBvcm5pYS5jb20KfGh0dHA6Ly91cG9ybmlhLmNvbQp8fHVwcm94eS5vcmcKfGh0 -dHA6Ly90b3IuY24udXB0b2Rvd24uY29tLwoudXB3aWxsLm9yZwp1cjdzLmNvbQp8 -fHVyYmFuc3Vydml2YWwuY29tCm15c2hhcmUudXJsLmNvbS50dy8KfHx1cmxib3Jn -LmNvbQp8fHVybHBhcnNlci5jb20KdXMudG8KfHx1c2Fjbi5jb20KLnVzYWlwLmV1 -Cnx8dXNhaXAuZXUKZGFsYWlsYW1hLnVzYy5lZHUKYmV0YS51c2VqdW1wLmNvbQp8 -fHVzZmsubWlsCnx8dXNtYS5lZHUKfHx1c21jLm1pbAp8aHR0cDovL3RhcnIudXNw -dG8uZ292Lwp8fHRzZHIudXNwdG8uZ292Ci51c3RyZWFtLnR2Cnx8dXN0cmVhbS50 -dgohLS18fHVzdHdyYXAuaW5mbwp1c3VzLmNjCi51dG9waWFucGFsLmNvbQp8fHV0 -b3BpYW5wYWwuY29tCi51dS1nZy5jb20KLnV2d3h5ei54eXoKfHx1dnd4eXoueHl6 -Ci51d2FudHMuY29tCi51d2FudHMubmV0CnV5Z2h1ci5jby51awp8aHR0cDovL3V5 -Z2h1ci1qLm9yZwp8fHV5Z2h1cmFtZXJpY2FuLm9yZwoudXlnaHVyY2FuYWRpYW5z -b2NpZXR5Lm9yZwoudXlnaHVyZW5zZW1ibGUuY28udWsKfHx1eWdodXJjb25ncmVz -cy5vcmcKLnV5Z2h1cnBlbi5vcmcKLnV5Z2h1cnByZXNzLmNvbQoudXlnaHVyc3R1 -ZGllcy5vcmcKfGh0dHA6Ly91eWdodXJzdHVkaWVzLm9yZwp1eWd1ci5vcmcKfGh0 -dHA6Ly91eW1hYXJpcC5jb20vCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1WVi0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0KLnYycmF5LmNvbQp8aHR0cDovL3YycmF5LmNv -bQoudmFuMDAxLmNvbQoudmFuNjk4LmNvbQoudmFuZW11LmNuCi52YW5pbGxhLWpw -LmNvbQoudmFucGVvcGxlLmNvbQp2YW5za3kuY29tCnx8dmNmLW9ubGluZS5vcmcK -fHx2Y2ZidWlsZGVyLm9yZwoudmVnYXNyZWQuY29tCi52ZWxrYWVwb2NoYS5zawou -dmVuYmJzLmNvbQoudmVuY2hpbmEuY29tCnZlb2guY29tCm15c2l0ZS52ZXJpem9u -Lm5ldAp2ZXJtb250dGliZXQub3JnCi52ZXJzYXZwbi5jb20KfHx2ZXJzYXZwbi5j -b20KfHx2ZXJ5YnMuY29tCi52ZnQuY29tLnR3Ci52aWJlci5jb20KfHx2aWJlci5j -b20KLnZpY2EuaW5mbwoudmljdGltc29mY29tbXVuaXNtLm9yZwp8aHR0cDovL3Zp -Y3RpbXNvZmNvbW11bmlzbS5vcmcKfHx2aWQubWUKfHx2aWRibGUuY29tCnZpZGVv -YmFtLmNvbQp8fHZpZGVvYmFtLmNvbQoudmlkZW9kZXRlY3RpdmUuY29tCi52aWRl -b21lZ2EudHYKfHx2aWRlb21lZ2EudHYKLnZpZGVvbW8uY29tCnZpZGVvcGVkaWF3 -b3JsZC5jb20KLnZpZGluZm8ub3JnL3ZpZGVvCnZpZXRkYWlreW5ndXllbi5jb20K -LnZpamF5YXRlbXBsZS5vcmcKfHx2aWtpLmNvbQp2aW1lby5jb20KfHx2aW1lby5j -b20KfHx2aW1wZXJhdG9yLm9yZwp8fHZpbmNuZC5jb20KfHx2aW5uaWV2LmNvbQp8 -aHR0cDovL3d3dy5saWIudmlyZ2luaWEuZWR1L2FyZWEtc3R1ZGllcy9UaWJldC90 -aWJldC5odG1sCnZpc2libGV0d2VldHMuY29tCnxodHRwOi8vbnkudmlzaW9udGlt -ZXMuY29tCi52aXRhbDI0Ny5vcmcKfHx2aXUuY29tCi52aXZhaGVudGFpNHUubmV0 -Ci52aXZhdHViZS5jb20KLnZpdnRob21hcy5jb20KfHx2aXZ0aG9tYXMuY29tCi52 -am1lZGlhLmNvbS5oawoudmxsY3Mub3JnCnxodHRwOi8vdmxsY3Mub3JnCnx8dm1p -eGNvcmUuY29tCmNuLnZvYS5tb2JpCnR3LnZvYS5tb2JpCi52b2FjaGluZXNlYmxv -Zy5jb20KfHx2b2FjaGluZXNlYmxvZy5jb20Kdm9hZ2QuY29tCi52b2FjYW50b25l -c2UuY29tCnx8dm9hY2FudG9uZXNlLmNvbQp2b2FjaGluZXNlLmNvbQp8fHZvYWNo -aW5lc2UuY29tCi52b2FuZXdzLmNvbQp2b2F0aWJldGFuLmNvbQp8fHZvYXRpYmV0 -YW4uY29tCi52b2F0aWJldGFuZW5nbGlzaC5jb20KfHx2b2F0aWJldGFuZW5nbGlz -aC5jb20KLnZvY2F0aXYuY29tCnZvY24udHYKLnZvdC5vcmcKfHx2b3Qub3JnCi52 -b3ZvMjAwMC5jb20KfGh0dHA6Ly92b3ZvMjAwMC5jb20KLnZveGVyLmNvbQp8fHZv -eGVyLmNvbQoudm95LmNvbQoudnBuNGFsbC5jb20KLnZwbmFjY291bnQub3JnCnxo -dHRwOi8vdnBuYWNjb3VudC5vcmcKfHx3d3cudnBuY3VwLmNvbQp2cG5ib29rLmNv -bQoudnBuY291cG9ucy5jb20KfGh0dHA6Ly92cG5jb3Vwb25zLmNvbQoudnBuZGFk -YS5jb20KfHx2cG5kYWRhLmNvbQoudnBuZmFuLmNvbQp2cG5maXJlLmNvbQoudnBu -Zm9yZ2FtZS5uZXQKfHx2cG5mb3JnYW1lLm5ldAp8fHZwbnVubGltaXRlZGFwcC5j -b20KfHx2cG5nYXRlLmpwCi52cG5nYXRlLm5ldAp8fHZwbmdhdGUubmV0Ci52cG5n -cmF0aXMubmV0CnZwbmhxLmNvbQoudnBubWFzdGVyLmNvbQp8fHZwbm1hc3Rlci5j -b20KLnZwbmluamEubmV0Cnx8dnBuaW5qYS5uZXQKfHx2cG5pbnRvdWNoLm5ldAou -dnBucGljay5jb20KfHx2cG5waWNrLmNvbQp8fHZwbnBvcC5jb20KfHx2cG5wcm9u -ZXQuY29tCi52cG5yZWFjdG9yLmNvbQp8fHZwbnJlYWN0b3IuY29tCnx8dnBucmV2 -aWV3ei5jb20KLnZwbnNlY3VyZS5tZQp8fHZwbnNlY3VyZS5tZQoudnBuc3AuY29t -Ci52cG50dW5uZWwuY29tCnx8dnBudHVubmVsLmNvbQoudnBudWsuaW5mbwp8fHZw -bnVrLmluZm8KLnZwbnZpcC5jb20KfHx2cG52aXAuY29tCi52cG9ybi5jb20KfHx2 -cG9ybi5jb20KLnZwc2VyLm5ldAp2cmFpZXNhZ2Vzc2UubmV0Cnx8dnR1bm5lbC5j -b20KfHx2dWt1LmNjCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1XVy0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0KfHx3Lm9yZwpsaXN0cy53My5vcmcvYXJjaGl2ZXMvcHVi -bGljCiEtLXx8dzNzY2hvb2xzLmNvbQp8fHdhZmZsZTE5OTkuY29tCi53YWhhcy5j -b20KLndhaWdhb2J1LmNvbQp3YWlrZXVuZy5vcmcvcGhwX3dpbmQKLndhaXdhaWVy -LmNvbQp8aHR0cDovL3dhaXdhaWVyLmNvbQp3YWxsb3Jub3Qub3JnCnx8d2FsbHBh -cGVyY2FzYS5jb20KLndhbGxwcm94eS5jb20KQEB8fHdhbGxwcm94eS5jb20uY24K -fHx3YWx0ZXJtYXJ0aW4uY29tCnx8d2FsdGVybWFydGluLm9yZwp8fHd3dy53YW4t -cHJlc3Mub3JnCnx8d2FuZGVyaW5naG9yc2UubmV0Cnx8d2FuZ2FmdS5uZXQKfHx3 -YW5namluYm8ub3JnCi53YW5namluYm8ub3JnCndhbmdsaXhpb25nLmNvbQoud2Fu -Z28ub3JnCnx8d2FuZ28ub3JnCndhbmdydW9zaHVpLm5ldAp3d3cud2FuZ3J1b3dh -bmcub3JnCndhbnQtZGFpbHkuY29tCndhcGVkaWEubW9iaS96aHNpbXAKfHx3YXNl -bHByby5jb20KLndhdGNoaW5lc2UuY29tCi53YXR0cGFkLmNvbQp8fHdhdHRwYWQu -Y29tCi5tYWt6aG91LndhcmVob3VzZTMzMy5jb20Kd2FzaGVuZy5uZXQKfHx3YXRj -aG15Z2YubmV0Cnx8d2F2LnR2Ci53ZGY1LmNvbQoud2VhcmVoYWlyeS5jb20KLndl -YXJuLmNvbQp8fHdlYXJuLmNvbQp8aHR0cDovL2hrY29jLndlYXRoZXIuY29tLmhr -Cnx8aHVkYXRvcmlxLndlYi5pZAp8fHdlYjJwcm9qZWN0Lm5ldAp3ZWJiYW5nLm5l -dAoud2ViZXZhZGVyLm9yZwoud2ViZnJlZXIuY29tCndlYmxhZ3UuY29tCi53ZWJq -Yi5vcmcKLndlYnJ1c2gubmV0CndlYnMtdHYubmV0Ci53ZWJzaXRlcHVsc2UuY29t -L2hlbHAvdGVzdHRvb2xzLmNoaW5hLXRlc3QKfGh0dHA6Ly93d3cud2Vic25hcHIu -Y29tCi53ZWJ3YXJwZXIubmV0CnxodHRwOi8vd2Vid2FycGVyLm5ldAp3ZWJ3b3Jr -ZXJkYWlseS5jb20KLndlZWttYWcuaW5mbwp8fHdlZmlnaHRjZW5zb3JzaGlwLm9y -Zwoud2Vmb25nLmNvbQp3ZWlib2xlYWsuY29tCndlaWppbmdzaGVuZy5vcmcKLndl -aW1pbmcuaW5mbwp8fHdlaW1pbmcuaW5mbwp3ZWlxdWFud2FuZy5vcmcKfGh0dHA6 -Ly93ZWlzdW8ud3MKLndlbG92ZWNvY2suY29tCi53ZW1pZ3JhdGUub3JnCnxodHRw -Oi8vd2VtaWdyYXRlLm9yZwp3ZW5nZXdhbmcuY29tCnx8d2VuZ2V3YW5nLm9yZwou -d2VuaHVpLmNoCnxodHRwOi8vdHJhbnMud2Vud2VpcG8uY29tL2diLwp3ZW54dWVj -aXR5LmNvbQoud2VueXVuY2hhby5jb20KfHx3ZW55dW5jaGFvLmNvbQoud2VzdGNh -LmNvbQp8fHdlc3RjYS5jb20KfHx3ZXN0ZXJud29sdmVzLmNvbQoud2VzdGtpdC5u -ZXQKfHx3ZXN0cG9pbnQuZWR1Ci53ZXN0ZXJuc2h1Z2RlbnNvY2lldHkub3JnCndl -dHB1c3N5Z2FtZXMuY29tCi53ZXRwbGFjZS5jb20Kd2V4aWFvYm8ub3JnCnx8d2V4 -aWFvYm8ub3JnCndlemhpeW9uZy5vcmcKfHx3ZXpvbmUubmV0Ci53Zm9ydW0uY29t -Cnx8d2ZvcnVtLmNvbS8KLndoYXRibG9ja2VkLmNvbQp8fHdoYXRibG9ja2VkLmNv -bQoud2hlYXRzZWVkcy5vcmcKfHx3aGVlbG9ja3NsYXRpbi5jb20KLndoaXBwZWRh -c3MuY29tCiEtLXxodHRwOi8vd2hvLmlzLwp3aG90YWxraW5nLmNvbQp3aHlsb3Zl -ci5jb20KfHx3aHl4Lm9yZwp8aHR0cDovL2V2Y2hrLndpa2lhLmNvbQpjbi51bmN5 -Y2xvcGVkaWEud2lraWEuY29tCnpoLnVuY3ljbG9wZWRpYS53aWtpYS5jb20KfHx3 -aWtpbGVha3MuY2gKfHx3aWtpbGVha3MuZGUKfHx3aWtpbGVha3MuZXUKfHx3aWtp -bGVha3MubHUKLndpa2lsZWFrcy5vcmcKfHx3aWtpbGVha3Mub3JnCnx8d2lraWxl -YWtzLnBsCi53aWtpbGVha3MtZm9ydW0uY29tCndpbGRhbW1vLmNvbQp8fGNvbGxh -dGVyYWxtdXJkZXIuY29tCnx8Y29sbGF0ZXJhbG11cmRlci5vcmcKd2lraWxpdnJl -cy5pbmZvL3dpa2kvJUU5JTlCJUI2JUU1JTg1JUFCJUU1JUFFJUFBJUU3JUFCJUEw -Cnx8d2lraW1hcGlhLm9yZwoKIS0tLS0tLS0tLS0tLS1XaWtpcGVkaWEgUmVsYXRl -ZC0tLS0tLS0tLS0tLS0KISFFbWVyZ2VuY3kgbmVlZCBvbmx5KElQL1BvcnQgYmxv -Y2sgdXNhZ2UpISEKIS0tLS0tLTAtLS0tLS0KIS0tfHxtZWRpYXdpa2kub3JnCiEt -LUBAfHxtLm1lZGlhd2lraS5vcmcKIS0tLS0tLTEtLS0tLS0KIS0tfHx3aWtpZGF0 -YS5vcmcKIS0tQEB8fG0ud2lraWRhdGEub3JnCiEtLS0tLS0yLS0tLS0tCiEtLXx8 -d2lraW1lZGlhLm9yZwohLS1AQHx8bGlzdHMud2lraW1lZGlhLm9yZwohLS1AQHx8 -bS53aWtpbWVkaWEub3JnCiEtLUBAfHxwaGFicmljYXRvci53aWtpbWVkaWEub3Jn -CiEtLUBAfHx1cGxvYWQud2lraW1lZGlhLm9yZwohLS1AQHx8d2lraXRlY2gud2lr -aW1lZGlhLm9yZwohLS0tLS0tMy0tLS0tLQohLS18fHdpa2lib29rcy5vcmcKIS0t -QEB8fG0ud2lraWJvb2tzLm9yZwohLS0tLS0tNC0tLS0tLQohLS18fHdpa2l2ZXJz -aXR5Lm9yZwohLS1AQHx8bS53aWtpdmVyc2l0eS5vcmcKIS0tLS0tLTUtLS0tLS0K -IS0tfHx3aWtpc291cmNlLm9yZwohLS1AQHx8bS53aWtpc291cmNlLm9yZwp8aHR0 -cDovL3poLndpa2lzb3VyY2Uub3JnCiEtLS0tLS02LS0tLS0tCiEtLXx8d2lraXF1 -b3RlLm9yZwohLS1AQHx8bS53aWtpcXVvdGUub3JnCiEtLS0tLS03LS0tLS0tCiEt -LXx8d2lraW5ld3Mub3JnCiEtLUBAfHxtLndpa2luZXdzLm9yZwp8aHR0cDovL3po -Lndpa2luZXdzLm9yZwohLS0tLS0tOC0tLS0tLQohLS18fHdpa2l2b3lhZ2Uub3Jn -CiEtLUBAfHxtLndpa2l2b3lhZ2Uub3JnCnxodHRwOi8vemgud2lraXZveWFnZS5v -cmcKIS0tLS0tLTktLS0tLS0KIS0tfHx3aWt0aW9uYXJ5Lm9yZwohLS1AQHx8bS53 -aWt0aW9uYXJ5Lm9yZwp8aHR0cDovL3poLndpa3Rpb25hcnkub3JnCiEtLS0tLTEw -LS0tLS0tCiEtLXx8d2lraW1lZGlhZm91bmRhdGlvbi5vcmcKIS0tQEB8fG0ud2lr -aW1lZGlhZm91bmRhdGlvbi5vcmcKIS0tLS1NYWluLS0tLS0KIS0tfHx3aWtpcGVk -aWEub3JnCnpoLndpa2lwZWRpYS5vcmcKIS0tfHx6aC53aWtpcGVkaWEub3JnCnpo -Lm0ud2lraXBlZGlhLm9yZwp8aHR0cHM6Ly96aC5tLndpa2lwZWRpYS5vcmcKIS0t -QEB8fG0ud2lraXBlZGlhLm9yZwp8aHR0cHM6Ly96aC53aWtpcGVkaWEub3JnCgp8 -fHdpa2l3aWtpLmpwCnx8Y2FzaW5vLndpbGxpYW1oaWxsLmNvbQp8fHNwb3J0cy53 -aWxsaWFtaGlsbC5jb20KfHx2ZWdhcy53aWxsaWFtaGlsbC5jb20KfHx3aWxsdy5u -ZXQKfHx3aW5kb3dzcGhvbmVtZS5jb20Kd2lubmluZzExLmNvbQp3aW53aGlzcGVy -cy5pbmZvCnx8d2lyZWRieXRlcy5jb20KfHx3aXJlZHBlbi5jb20KfHx3aXJlc2hh -cmsub3JnCi53aXNkb21wdWJzLm9yZwoud2lzZXZpZC5jb20KfHx3aXNldmlkLmNv -bQoud2l0bmVzc2xlZXRlYWNoaW5nLmNvbQoud2l0b3BpYS5uZXQKLndqYmsub3Jn -Cnx8d2piay5vcmcKfGh0dHA6Ly93bi5jb20KLnduYWNnLmNvbQoud28udGMKfHx3 -b2VzZXIuY29tCnxodHRwOi8vd29lc2VybWlkZGxlLXdheS5uZXQvCi53b2thci5v -cmcKfGh0dHA6Ly93b2thci5vcmcKd29sZmF4LmNvbQp8fHdvbGZheC5jb20Kd29v -cGllLmpwCnx8d29vcGllLmpwCndvb3BpZS50dgp8fHdvb3BpZS50dgp8fHdvcmth -dHJ1bmEuY29tCi53b3JrZXJkZW1vLm9yZy5oawp8fHdvcmtlcnN0aGViaWcubmV0 -Ci53b3JsZGNhdC5vcmcKd29ybGRqb3VybmFsLmNvbQoud29ybGR2cG4ubmV0Cnx8 -d29ybGR2cG4ubmV0Cgoud29yZHByZXNzLmNvbQp8aHR0cDovLyoud29yZHByZXNz -LmNvbQp8fGNoZW5zaGFuMjAwNDIwMDUud29yZHByZXNzLmNvbQp8fHdwLmNvbQoK -IS18fHdvcm1zY3VscHRvci5jb20KLndvdy5jb20KLndvdy1saWZlLm5ldAp8fHdv -d2xlZ2FjeS5tbAp8fHdvd3Bvcm4uY29tCnx8d293Z2lybHMuY29tCndveGluZ2h1 -aWd1by5jb20KLndveWFvbGlhbi5vcmcKfGh0dHA6Ly93b3lhb2xpYW4ub3JnCi53 -cG9mb3J1bS5jb20KfHx3cG9mb3J1bS5jb20KLndxeWQub3JnCnx8d3F5ZC5vcmcK -d3JjaGluYS5vcmcKd3JldGNoLmNjCiEtY24ud3NqLmNvbS9nYi8yMDEzMDIxNS90 -ZWMxMTM4NTMuYXNwCi53c2ouY29tCnx8d3NqLmNvbQoud3NqLm5ldAoud3NqaGsu -Y29tCi53dGJuLm9yZwoud3RmcGVvcGxlLmNvbQp3dWVya2FpeGkuY29tCnx8d3Vm -YWZhbmd3ZW4uY29tCnd1Zmkub3JnLnR3Cnx8d3VndW9ndWFuZy5jb20Kd3VqaWUu -bmV0Cnd1amllbGl1bGFuLmNvbQp8fHd1amllbGl1bGFuLmNvbQp3dWthbmdydWku -bmV0Ci53d2l0di5jb20KfHx3d2l0di5jb20Kd3p5Ym95LmltL3Bvc3QvMTYwCgoh -LS0tLS0tLS0tLS0tLS0tLS0tLS1YWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K -LngtYmVycnkuY29tCnx8eC1iZXJyeS5jb20KfHx4LWFydC5jb20KfHx4LXdhbGwu -b3JnCngxOTQ5eC5jb20KeDM2NXguY29tCnhhbmdhLmNvbQp8fHhiYWJlLmNvbQou -eGJvb2tjbi5jb20KfHx4Ym9va2NuLmNvbQp8fHhjYWZlLmluCnx8eGNpdHkuanAK -Lnhjcml0aWMuY29tCnxodHRwOi8vY2RuKi54ZGEtZGV2ZWxvcGVycy5jb20KLnhl -cm90aWNhLmNvbQpkZXN0aW55LnhmaWxlcy50by91YmJ0aHJlYWRzCi54Zm0ucHAu -cnUKeGdteWQuY29tCnhoYW1zdGVyLmNvbQoueGlhbmNoYXdhbmcubmV0Ci54aWFu -amlhbi50dwp8aHR0cDovL3hpYW5qaWFuLnR3Ci54aWFucWlhby5uZXQKLnhpYW9j -aHVuY25qcC5jb20KLnhpYW9kLmluCi54aWFvaGV4aWUuY29tCnx8eGlhb2xhbi5t -ZQp8fHhpYW9tYS5vcmcKfHx4aWFvaGV4aWUuY29tCnhpZXpodWEuY29tCi54aWh1 -YS5lcwpmb3J1bS54aW5iYW8uZGUvZm9ydW0KLnhpbmcuY29tCnxodHRwOi8veGlu -Zy5jb20KLnhpbm1pYW8uY29tLmhrCnx8eGlubWlhby5jb20uaGsKeGluc2hlbmcu -bmV0CnhpbnNoaWp1ZS5jb20KeGluaHVhbmV0Lm9yZwp8aHR0cDovL3hpbnl1YmJz -Lm5ldAoueGlvbmdwaWFuLmNvbQoueGl1cmVuLm9yZwp4aXphbmctemhpeWUub3Jn -CnhqcC5jYwp8fHhqcC5jYwp8fHhqdHJhdmVsZ3VpZGUuY29tCnhsZm10YWxrLmNv -bQp8fHhsZm13ei5pbmZvCnx8eG1sLXRyYWluaW5nLWd1aWRlLmNvbQp4bW92aWVz -LmNvbQp8fHhueHguY29tCnhwZG8ubmV0Cnx8eHB1ZC5vcmcKLnhyZW50ZHZkLmNv -bQp8fHh0dWJlLmNvbQpibG9nLnh1aXRlLm5ldAp2bG9nLnh1aXRlLm5ldAp4dXpo -aXlvbmcubmV0Cnx8eHVjaGFvLm9yZwp4dWNoYW8ubmV0Cnx8eHVjaGFvLm5ldAp4 -dmlkZW8uY2MKLnh2aWRlb3MuY29tCnx8eHZpZGVvcy5lcwoueHhiYnguY29tCi54 -eGxtb3ZpZXMuY29tCnx8eHh4LmNvbQoueHh4ZnVja21vbS5jb20KfHx4eHh4LmNv -bS5hdQoueHh4eW1vdmllcy5jb20KfGh0dHA6Ly94eHh5bW92aWVzLmNvbQp4eXMu -b3JnCnh5c2Jsb2dzLm9yZwp4eXk2OS5jb20KeHl5NjkuaW5mbwoKIS0tLS0tLS0t -LS0tLS0tLS0tLS0tWVktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnBhZ2UuYmlk -LnlhaG9vLmNvbQpibG9ncy55YWhvby5jby5qcApidXkueWFob28uY29tLnR3L2dk -c2FsZQpoay55YWhvby5jb20KaGsua25vd2xlZGdlLnlhaG9vLmNvbQpoay5teWJs -b2cueWFob28uY29tCnx8aGsubmV3cy55YWhvby5jb20KaGsucmQueWFob28uY29t -CmhrLnNlYXJjaC55YWhvby5jb20vc2VhcmNoCmhrLnZpZGVvLm5ld3MueWFob28u -Y29tL3ZpZGVvCm1lbWUueWFob28uY29tCiEtLXR3LnlhaG9vLmNvbQp8fHR3Lmtu -b3dsZWRnZS55YWhvby5jb20KfHx0dy5tYWxsLnlhaG9vLmNvbQp0dy55YWhvby5j -b20KfHx0dy5tb2JpLnlhaG9vLmNvbQp0dy5teWJsb2cueWFob28uY29tCnx8dHcu -bmV3cy55YWhvby5jb20KcHVsc2UueWFob28uY29tCnVwY29taW5nLnlhaG9vLmNv -bQp2aWRlby55YWhvby5jb20KfHx5YWhvby5jb20uaGsKfHx5YWtidXR0ZXJibHVl -cy5jb20KeWFtLmNvbQp8fHlhbS5jb20KfHx5YW0ub3JnLnR3Ci55YW5naGVuZ2p1 -bi5jb20KeWFuZ2ppYW5saS5jb20KLnlhc25pLmNvLnVrCnx8eWFzbmkuY28udWsK -fHx5YXN1a3VuaS5vci5qcAoueWR5LmNvbQoueWVhaHRlZW50dWJlLmNvbQp8fHll -YWh0ZWVudHViZS5jb20KfHx5ZWVsb3UuY29tCnllZXlpLmNvbQp5ZWdsZS5uZXQK -fHx5ZWdsZS5uZXQKLnllcy54eHgKfHx5ZXMxMjMuY29tLnR3Cnx8eWVzYXNpYS5j -b20KfHx5ZXNhc2lhLmNvbS5oawoueWVzLW5ld3MuY29tCnxodHRwOi8veWVzLW5l -d3MuY29tCnx8eWVjbC5uZXQKIS0teWZyb2cuY29tCnx8eWhjdy5uZXQKLnlpYmFk -YS5jb20KLnlpYmFvY2hpbmEuY29tCi55aWRpby5jb20KfHx5aWRpby5jb20KeWls -dWJicy5jb20KeGEueWltZy5jb20KLnlpbmdzdW9zcy5jb20KLnlpcHViLmNvbQp8 -fHlpcHViLmNvbQp5aW5sZWkub3JnL210Ci55b2J0LmNvbQoueW9naWNoZW4ub3Jn -Cnx8eW9naWNoZW4ub3JnCnlvbmcuaHUKLnlvcmtiYnMuY2EKfHx5b3V4dS5pbmZv -Ci55b3VqaXp6LmNvbQp8fHlvdWppenouY29tCnlvdW1ha2VyLmNvbQp5b3VuZ3Nw -aXJhdGlvbi5oawoueW91cGFpLm9yZwp8fHlvdXBhaS5vcmcKLnlvdXItZnJlZWRv -bS5uZXQKfHx5b3VyZXBlYXQuY29tCi55b3VycHJpdmF0ZXZwbi5jb20KfHx5b3Vy -cHJpdmF0ZXZwbi5jb20KLnlvdXNlbmRpdC5jb20KfHx5b3VzZW5kaXQuY29tCi55 -b3V0aG5ldHJhZGlvLm9yZy90bWl0L2ZvcnVtCmJsb2cueW91dGh3YW50LmNvbS50 -dwpzaGFyZS55b3V0aHdhbnQuY29tLnR3CnRvcGljLnlvdXRod2FudC5jb20udHcK -LnlvdXBvcm4uY29tCnx8eW91cG9ybi5jb20KLnlvdXBvcm5nYXkuY29tCnx8eW91 -cG9ybmdheS5jb20KLnlvdXJsaXN0ZW4uY29tCnxodHRwOi8veW91cmxpc3Rlbi5j -b20KLnlvdXJsdXN0LmNvbQp8aHR0cDovL3lvdXJsdXN0LmNvbQp5b3VzaHVuMTIu -Y29tCi55b3V0dWJlY24uY29tCnlvdXZlcnNpb24uY29tCnx8eW91dmVyc2lvbi5j -b20KYmxvZy55b3V4dS5pbmZvLzIwMTAvMDMvMTQvd2VzdC1jaGFtYmVyCnl0aHQu -bmV0Cnl1YW5taW5nLm5ldAoueXVhbnpoZW5ndGFuZy5vcmcKLnl1bGdodW4uY29t -Cnx8eXVuY2hhby5uZXQKLnl1dnV0dS5jb20KfHx5dmVzZ2VsZXluLmNvbQoueXdw -dy5jb20vZm9ydW1zL2hpc3RvcnkvcG9zdC9BMC9wMC9odG1sLzIyNwp5eDUxLm5l -dAoueXlpaS5vcmcKfHx5eWlpLm9yZwoueXp6ay5jb20KfGh0dHA6Ly95enprLmNv -bQoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tWlotLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tCnphY2Vib29rLmNvbQouemFsbW9zLmNvbQp8fHphbm5lbC5jb20KLnphb2Jh -by5jb20KLnphb2Jhby5jb20uc2cKfHx6YW9iYW8uY29tLnNnCi56YW96b24uY29t -CiEtLS56ZG5ldC5jb20udHcvbmV3cy9zb2Z0d2FyZS8wLDIwMDAwODU2NzgsMjAx -MTExODcsMDAKfHx6ZG5ldC5jb20udHcKLnplbGxvLmNvbQp8fHplbGxvLmNvbQou -emVuZ2ppbnlhbi5vcmcKfHx6ZXV0Y2guY29tCiEtLXd3dy56ZnJlZXQuY29tL3Bv -c3QvdXNlanVtcC1icm93bnMuaHRtbAouemZyZWV0LmNvbQouemdzZGRoLmNvbQp6 -Z3pjamoubmV0Ci56aGFuYmluLm5ldAp8fHpoYW5iaW4ubmV0Ci56aGFuZ2JvbGku -bmV0Cnx8emhhbmd0aWFubGlhbmcuY29tCnpoZW5naHVpLm9yZwp6aGVuZ3d1bmV0 -Lm9yZwp6aGVubGlidS5pbmZvCnx8emhlbmxpYnUuaW5mbwouemhlbmxpYnUxOTg0 -LmNvbQp8aHR0cDovL3poZW5saWJ1MTk4NC5jb20KfGh0dHA6Ly96aGVueGlhbmcu -Yml6Ci56aGluZW5nbHV5b3UuY29tCnpob25nZ3VvLmNhCnxodHRwOi8vemhvbmdn -dW9yZW5xdWFuLm9yZwp6aG9uZ2d1b3Rlc2UubmV0Cnx8emhvbmdndW90ZXNlLm5l -dAp8fHpob25nbWVuZy5vcmcKfHx6aHJlYWRlci5jb20Kemh1YW5nYmkubWUvYWNj -b3VudC9sb2dpbi91cmwtTHc9PQouemh1YW54aW5nLmNuCnx8emh1YXRpZWJhLmNv -bQp6aHVpY2hhZ3Vvamkub3JnCnx8emh1aWNoYWd1b2ppLm9yZwp8aHR0cDovL2Jv -b2suemk1Lm1lCi56aWRkdS5jb20vZG93bmxvYWQKfHx6aWxsaW9uay5jb20KLnpp -bmlvLmNvbQp8fHppbmlvLmNvbQp8fHppcGxpYi5jb20KLnppcG9ybi5jb20KLnpr -YWlwLmNvbQp8fHprYWlwLmNvbQpyZWFsZm9ydW0uemtpei5jb20KIS0tfHx6bGli -Lm5ldAp8fHptdy5jbgouem9kZ2FtZS51cwp6b21vYm8ubmV0Ci56b25hZXVyb3Bh -LmNvbQp8fHpvbmFldXJvcGEuY29tCnx8em9uZ2hleGlud2VuLmNvbQouem9uZ2hl -eGlud2VuLm5ldAp8fHpvb3Rvb2wuY29tCi56b296bGUubmV0CndyaXRlci56b2hv -LmNvbQouenNoYXJlLm5ldC9kb3dubG9hZAouenNyaGFvLmNvbQouenVvLmxhCnx8 -enVvLmxhCnx8enVvYmlhby5tZQouenVvbGEuY29tCnx8enVvbGEuY29tCnx8enZl -cmVmZi5jb20KLnp5bmFpbWEuY29tCnp5emM5LmNvbQouenpjYXJ0b29uLmNvbQoh -IyMjIyMjIyMjIyMjIyNHZW5lcmFsIExpc3QgRW5kIyMjIyMjIyMjIyMjIyMjIyMK -CiEjIyMjIyMjIyMjI1N1cHBsZW1lbnRhbCBMaXN0IFN0YXJ0IyMjIyMjIyMjIyMj -IwohLS0tLS0tLS0tLS0tLS0tLS1VUkwgS2V5d29yZHMtLS0tLS0tLS0tLS0tLS0t -LS0KNjRtZW1vCmFIUjBjSE02THk5NVpXTnNMbTVsZEEKZnJlZW5ldAouZ29vZ2xl -LiovZmFsdW4KcGhvYm9zLmFwcGxlLmNvbSovdmlkZW8KcT1mcmVlZG9tCnElM0Rm -cmVlZG9tCnJlbWVtYmVyaW5nX3RpYW5hbm1lbl8yMF95ZWFycwpzZWFyY2gqc2Fm -ZXdlYgpxPXRyaWFuZ2xlCnElM0RUcmlhbmdsZQp1bHRyYXJlYWNoCnVsdHJhc3Vy -Zgp6aGVuZ2ppYW4KCiEtLS0tLS0tLS0tLS0tLS0tLS0tVFcgR292cy0tLS0tLS0t -LS0tLS0tLS0tLS0tLQouZ292LnR3Cnx8dGFjYy5jd2IuZ292LnR3CmltbWlncmF0 -aW9uLmdvdi50dwp8fG5zYy5nb3YudHcKfHxudGJuYS5nb3YudHcKfHxudHNuYS5n -b3YudHcKdGFpcGVpLmdvdi50dwpAQHx8dGF4Lm5hdC5nb3YudHcKQEB8fG1vZS5n -b3YudHcKIS0tQEB8fGN3Yi5nb3YudHcKQEB8fG5wbS5nb3YudHcKQEB8fHlhdHNl -bi5nb3YudHcKQEB8fG12ZGlzLmdvdi50dwpAQHx8c3RkdGltZS5nb3YudHcKQEB8 -fG5tbWJhLmdvdi50dwpAQHx8bnRkbWguZ292LnR3CkBAfHxncmIuZ292LnR3CkBA -fHx0cGRlLmFpZGUuZ292LnR3CkBAfHxtYXRzdS1uZXdzLmdvdi50dwpAQHx8ZGFw -dS1ob3VzZS5nb3YudHcKQEB8fHZnaHRjLmdvdi50dwpAQHx8YWlkZS5nb3YudHcK -QEB8fGhjaGNjLmdvdi50dwpAQHx8bnR1aC5nb3YudHcKQEB8fG5ocmkuZ292LnR3 -CkBAfHxuc3RtLmdvdi50dwpAQHx8bnRzZWMuZ292LnR3CkBAfHxuZXIuZ292LnR3 -CkBAfHxubXRsLmdvdi50dwpAQHx8bnRsLmdvdi50dwpAQHx8cGV0Lmdvdi50dwpA -QHx8a2hjYy5nb3YudHcKQEB8fG5tbWJhLmdvdi50dwpAQHx8a2htcy5nb3YudHcK -QEB8fHdhbmZhbmcuZ292LnR3CkBAfHxuaWN0Lmdvdi50dwpAQHx8YXJ0ZS5nb3Yu -dHcKQEB8fG5taC5nb3YudHcKQEB8fG5tcC5nb3YudHcKQEB8fHRwaGNjLmdvdi50 -dwpAQHx8aW5lci5nb3YudHcKQEB8fHRuY3NlYy5nb3YudHcKQEB8fG5zcG8uZ292 -LnR3CkBAfHxhaWRlLmdvdi50dwpAQHx8bmNyZWUuZ292LnR3CkBAfHx2Z2hrcy5n -b3YudHcKQEB8fHRjaGIuZ292LnR3CkBAfHxwYWJwLmdvdi50dwpAQHx8aXRyYy5n -b3YudHcKQEB8fGRmLmdvdi50dwpAQHx8d29tZW5idXNpbmVzcy5ueWMuZ292LnR3 -CkBAfHxnc24tY2VydC5uYXQuZ292LnR3CkBAfHxray5nb3YudHcKQEB8fHRoYnN0 -Yy5nb3YudHcKQEB8fGNvbW5ld3MuZ2lvLmdvdi50dwpAQHx8Y29tbmV3cy5naW8u -Z292LnR3CkBAfHxrbGNjYWIuZ292LnR3CkBAfHx5dnRjLmdvdi50dwpAQHx8YWZ0 -eWdoLmdvdi50dwpAQHx8a2xyYS5nb3YudHcKQEB8fGx1bmd0YW5oci5nb3YudHcK -QEB8fHRhb3l1YW4uZ292LnR3CkBAfHxoY2MuZ292LnR3CkBAfHxudnJpLmdvdi50 -dwpAQHx8bm12dHRjLmdvdi50dwpAQHx8a21oLmdvdi50dwpAQHx8cGF0ZWhyLmdv -di50dwpAQHx8bmVyY2guZ292LnR3CkBAfHxrbXNlaC5nb3YudHcKQEB8fG5lcnR0 -Lmdvdi50dwpAQHx8Y3ljYWIuZ292LnR3CkBAfHxjaHVrdWFuZy5nb3YudHcKQEB8 -fGd5c2QubnljLmdvdi50dwpAQHx8Y3AtaG91c2UuZ292LnR3CkBAfHx2Z2h0cGUu -Z292LnR3CkBAfHxldHJhaW5pbmcuZ292LnR3CkBAfHxzdGFnLmdvdi50dwpAQHx8 -YmRoci5nb3YudHcKQEB8fHRjc2FjLmdvdi50dwpAQHx8aW1hZ2VzYmxvZy5naW8u -Z292LnR3CkBAfHxhcnRlLmdvdi50dwpAQHx8ZG10aXAuZ292LnR3CkBAfHxjaGNj -Yy5nb3YudHcKQEB8fGhlbmdjaHVlbi5nb3YudHcKQEB8fGhzaW5jaHUtY2MuZ292 -LnR3CkBAfHw5MjEuZ292LnR3CkBAfHxuY2RyLm5hdC5nb3YudHcKQEB8fDRwcHBj -Lmdvdi50dwpAQHx8a2xzaW8uZ292LnR3CkBAfHxuaWNpLm5hdC5nb3YudHcKQEB8 -fGNyb21vdGMubmF0Lmdvdi50dwpAQHx8dGFpdHVuZy1ob3VzZS5nb3YudHcKISMj -IyMjIyMjIyMjIyNTdXBwbGVtZW50YWwgTGlzdCBFbmQjIyMjIyMjIyMjIyMjCgoh -IyMjIyMjIyMjIyMjIyMjI1doaXRlbGlzdCBTdGFydCMjIyMjIyMjIyMjIyMjIyMK -QEB8fGFsaXl1bi5jb20KQEB8fGJhaWR1LmNvbQohLS1AQHx8YmluZy5jb20KQEB8 -fGNoaW5hc28uY29tCkBAfHxjaGluYXouY29tCkBAfGh0dHA6Ly9ucmNoLmN1bHR1 -cmUudHcvCiEtLUlTUCBjYWNoZSB3b3JrcyBzb21ldGltZXMsIHZlcmlmaWVkIGF0 -IGRycGVuZyArIGdlaHVhLgpAQHx8ZGwuZ29vZ2xlLmNvbQpAQHx8a2guZ29vZ2xl -LmNvbQpAQHx8Zm9udHMuZ29vZ2xlYXBpcy5jb20KQEB8fGNuLmdyYXZhdGFyLmNv -bQpAQHx8Y3NpLmdzdGF0aWMuY29tCkBAfHxmb250cy5nc3RhdGljLmNvbQpAQHx8 -aGFvc291LmNvbQpAQHx8amQuY29tCkBAfHxqaWtlLmNvbQpAQHxodHRwOi8vdHJh -bnNsYXRlLmdvb2dsZS5jbgpAQHxodHRwOi8vd3d3Lmdvb2dsZS5jbi9tYXBzCkBA -fHxodHRwMi5nb2xhbmcub3JnCkBAfHxnb3YuY24KQEB8fHFxLmNvbQpAQHx8c2lu -YS5jbgpAQHx8c2luYS5jb20uY24KQEB8fHNvZ291LmNvbQpAQHx8c28uY29tCkBA -fHxzb3NvLmNvbQpAQHx8dGFvYmFvLmNvbQpAQHx8d2VpYm8uY29tCkBAfHx5YWhv -by5jbgpAQHx8eW91ZGFvLmNvbQpAQHx8emhvbmdzb3UuY29tCkBAfGh0dHA6Ly9p -bWUuYmFpZHUuanAKISMjIyMjIyMjIyMjIyMjIyNXaGl0ZWxpc3QgRW5kIyMjIyMj -IyMjIyMjIyMjIyMjCiEtLS0tLS0tLS0tLS0tLS0tLS0tLS1FT0YtLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLQo= \ No newline at end of file +MnAuY29tCi5zdGFydHBhZ2UuY29tCnx8c3RhcnRwYWdlLmNvbQouc3RhcnR1cGxp +dmluZ2NoaW5hLmNvbQp8aHR0cDovL3N0YXJ0dXBsaXZpbmdjaGluYS5jb20KfHxz +dGF0aWMtZWNvbm9taXN0LmNvbQp8fHN0Yy5jb20uc2EKfHxzdGVlbC1zdG9ybS5j +b20KLnN0ZWdhbm9zLmNvbQp8fHN0ZWdhbm9zLmNvbQouc3RlZ2Fub3MubmV0Ci5z +dGVwY2hpbmEuY29tCiEtLXx8c3RlcG1hbmlhLmNvbQpueS5zdGdsb2JhbGxpbmsu +Y29tCmhkLnN0aGVhZGxpbmUuY29tL25ld3MvcmVhbHRpbWUKc3Rob28uY29tCnx8 +c3Rob28uY29tCi5zdGlja2FtLmNvbQpzdGlja2VyYWN0aW9uLmNvbS9zZXNhd2UK +LnN0aWxlcHJvamVjdC5jb20KLnN0by5jYwouc3RvcG9yZ2FuaGFydmVzdGluZy5v +cmcKfHxzdG9yYWdlbmV3c2xldHRlci5jb20KLnN0b3JtLm1nCnx8c3Rvcm0ubWcK +LnN0b3B0aWJldGNyaXNpcy5uZXQKfHxzdG9wdGliZXRjcmlzaXMubmV0Cnx8c3Rv +cmlmeS5jb20KLnN0b3JtbWVkaWFncm91cC5jb20KfHxzdG93ZWJveWQuY29tCnN0 +cmFuYWJnLmNvbQp8fHN0cmFwbGVzc2RpbGRvLmNvbQp8fHN0cmVhbWluZ3RoZS5u +ZXQKc3RyZWVtYS5jb20vdHYvTlREVFZfQ2hpbmVzZQpjbi5zdHJlZXR2b2ljZS5j +b20vYXJ0aWNsZQpjbi5zdHJlZXR2b2ljZS5jb20vZGlhcnkKY24yLnN0cmVldHZv +aWNlLmNvbQp0dy5zdHJlZXR2b2ljZS5jb20KLnN0cmlraW5nbHkuY29tCnx8c3Ry +b25ndnBuLmNvbQouc3Ryb25nd2luZHByZXNzLmNvbQouc3R1ZGVudC50dy9kYgp8 +fHN0dWRlbnRzZm9yYWZyZWV0aWJldC5vcmcKfHxzdHVtYmxldXBvbi5jb20Kc3R1 +cGlkdmlkZW9zLmNvbQouc3VjY2Vzc2ZuLmNvbQpwYW5hbWFwYXBlcnMuc3VlZGRl +dXRzY2hlLmRlCi5zdWdhcnN5bmMuY29tCnx8c3VnYXJzeW5jLmNvbQouc3Vnb2Ji +cy5jb20KfHxzdWd1bWlydTE4LmNvbQp8fHN1aXNzbC5jb20Kc3VtbWlmeS5jb20K +LnN1bXJhbmRvLmNvbQp8fHN1bXJhbmRvLmNvbQpzdW4xOTExLmNvbQouc3VucG9y +bm8uY29tCnx8c3VubWVkaWEuY2EKfHxzdW5wb3Juby5jb20KLnN1bnNreWZvcnVt +LmNvbQouc3VudGEuY29tLnR3Ci5zdW52cG4ubmV0Ci5zdW9sdW8ub3JnCi5zdXBl +cmZyZWV2cG4uY29tCi5zdXBlcnZwbi5uZXQKfHxzdXBlcnZwbi5uZXQKLnN1cGVy +em9vaS5jb20KfGh0dHA6Ly9zdXBlcnpvb2kuY29tCi5zdXBwaWcubmV0Ci5zdXBy +ZW1lbWFzdGVydHYuY29tCnxodHRwOi8vc3VwcmVtZW1hc3RlcnR2LmNvbQouc3Vy +ZmVhc3kuY29tCnx8c3VyZmVhc3kuY29tCi5zdXJmZWFzeS5jb20uYXUKfGh0dHA6 +Ly9zdXJmZWFzeS5jb20uYXUKfHxzdXJyZW5kZXJhdDIwLm5ldAouc3V5YW5nZy5j +b20KfGh0dHA6Ly9zdXlhbmdnLmNvbQouc3ZzZnguY29tCi5zd2lzc3Zwbi5uZXQK +fHxzd2lzc3Zwbi5uZXQKc3dpdGNodnBuLm5ldAp8fHN3aXRjaHZwbi5uZXQKLnN5 +ZG5leXRvZGF5LmNvbQp8fHN5ZG5leXRvZGF5LmNvbQouc3lsZm91bmRhdGlvbi5v +cmcKfHxzeW5jYmFjay5jb20Kc3lzcmVzY2NkLm9yZwouc3l0ZXMubmV0CmJsb2cu +c3l4ODYuY29tLzIwMDkvMDkvcHVmZgpibG9nLnN5eDg2LmNuLzIwMDkvMDkvcHVm +Zgouc3piYnMubmV0Ci5zemV0b3dhaC5vcmcuaGsKCiEtLS0tLS0tLS0tLS0tLS0t +LS0tLVRULS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8fHQtZy5jb20KLnQzNS5j +b20KLnQ2NnkuY29tCnx8dDY2eS5jb20KLnRhYS11c2Eub3JnCnxodHRwOi8vdGFh +LXVzYS5vcmcKLnRhYXplLnR3Cnx8dGFhemUudHcKfGh0dHA6Ly93d3cudGFibGVz +Z2VuZXJhdG9yLmNvbS8KdGFidHRlci5qcAoudGFjZW0ub3JnCi50YWNvbmV0LmNv +bS50dwp8fHRhZWRwLm9yZy50dwoudGFmbS5vcmcKLnRhZ3dhLm9yZy5hdQp0YWd3 +YWxrLmNvbQp8fHRhZ3dhbGsuY29tCnRhaHIub3JnLnR3Ci50YWlwZWlzb2NpZXR5 +Lm9yZwp8fHRhaXBlaXNvY2lldHkub3JnCi50YWl3YW5iaWJsZS5jb20KLnRhaXdh +bmNvbi5jb20KLnRhaXdhbmRhaWx5Lm5ldAp8fHRhaXdhbmRhaWx5Lm5ldAoudGFp +d2FuZGMub3JnCiEtLXx8dGFpd2FuZW1iYXNzeS5vcmcKLnRhaXdhbmp1c3RpY2Uu +Y29tCnRhaXdhbmtpc3MuY29tCnRhaXdhbm5hdGlvbi5jb20KdGFpd2FubmF0aW9u +LmNvbS50dwp8fHRhaXdhbm5jZi5vcmcudHcKfHx0YWl3YW5uZXdzLmNvbS50dwp8 +aHR0cDovL3d3dy50YWl3YW5vbmxpbmUuY2MvCiEtLXx8dGFpd2FudG9kYXkudHcK +dGFpd2FudHAubmV0Cnx8dGFpd2FudHQub3JnLnR3CnRhaXdhbnVzLm5ldAp0YWl3 +YW55ZXMuY29tCnRhaXdhbi1zZXguY29tCi50YWxrODUzLmNvbQoudGFsa2JveGFw +cC5jb20KfHx0YWxrYm94YXBwLmNvbQoudGFsa29ubHkubmV0Cnx8dGFsa29ubHku +bmV0Cnx8dGFtaWFvZGUudGsKfHx0YW5jLm9yZwp0YW5nYmVuLmNvbQoudGFuZ3Jl +bi51cwoudGFvaXNtLm5ldAp8aHR0cDovL3Rhb2lzbS5uZXQKLnRhb2x1bi5pbmZv +Cnx8dGFvbHVuLmluZm8KLnRhcGF0YWxrLmNvbQp8fHRhcGF0YWxrLmNvbQpibG9n +LnRhcmFnYW5hLmNvbQoudGFzY24uY29tLmF1Cnx8dGF1cC5uZXQKfGh0dHA6Ly93 +d3cudGF1cC5vcmcudHcKLnRhd2VldC5jb20KfHx0YXdlZXQuY29tCi50YmNvbGxl +Z2Uub3JnCnx8dGJjb2xsZWdlLm9yZwoudGJpLm9yZy5oawoudGJpY24ub3JnCi50 +Ymp5dC5vcmcKfHx0YnBpYy5pbmZvCi50YnJjLm9yZwp0YnMtcmFpbmJvdy5vcmcK +LnRic2VjLm9yZwp8fHRic2VjLm9yZwp0YnNra2luYWJhbHUucGFnZS50bAoudGJz +bWFsYXlzaWEub3JnCi50YnNuLm9yZwp8fHRic24ub3JnCi50YnNzZWF0dGxlLm9y +ZwoudGJzc3FoLm9yZwp8aHR0cDovL3Ric3NxaC5vcmcKdGJzd2Qub3JnCi50YnRl +bXBsZS5vcmcudWsKLnRidGhvdXN0b24ub3JnCi50Y2N3b25saW5lLm9yZwoudGNl +d2Yub3JnCnRjaHJkLm9yZwp0Y255bmoub3JnCnx8dGNwc3BlZWQuY28KLnRjcHNw +ZWVkLmNvbQp8fHRjcHNwZWVkLmNvbQoudGNzb2ZiYy5vcmcKLnRjc292aS5vcmcK +dGVhbWFtZXJpY2FueS5jb20KIS0tT1ZICnx8dGVjaHZpei5uZXQKfHx0ZWNrLmlu +Ci50ZWVuaWVmdWNrLm5ldAp0ZWVuc2luYXNpYS5jb20KLnRlbGVjb21zcGFjZS5j +b20KfHx0ZWxlZ3JhcGguY28udWsKLnRlbmFjeS5jb20KfHx0ZW56aW5wYWxtby5j +b20KLnRldy5vcmcKLnRoYWljbi5jb20KfHx0aGVhdHJ1bS1iZWxsaS5jb20KdGhl +YmxlbWlzaC5jb20KfHx0aGViY29tcGxleC5jb20KLnRoZWJvYnMuY29tCnx8dGhl +Ym9icy5jb20KLnRoZWNoaW5hYmVhdC5vcmcKfGh0dHA6Ly93d3cudGhlY2hpbmFz +dG9yeS5vcmcveWVhcmJvb2tzL3llYXJib29rLTIwMTIvCi50aGVkYWxhaWxhbWFt +b3ZpZS5jb20KfGh0dHA6Ly90aGVkYWxhaWxhbWFtb3ZpZS5jb20KfHx0aGVkdy51 +cwp0aGVmcm9udGllci5oay90Zgp8aHR0cDovL3RoZWdpb2l0aW5ob2Mudm4vCi50 +aGVnbHkuY29tCi50aGVob3RzLmluZm8KdGhlaG91c2VuZXdzLmNvbQp8fHRoZWh1 +bi5uZXQKLnRoZWluaXRpdW0uY29tCnx8dGhlaW5pdGl1bS5jb20KLnRoZW5ld3Ns +ZW5zLmNvbQp8fHRoZW5ld3NsZW5zLmNvbQoudGhlcGlyYXRlYmF5Lm9yZwp8fHRo +ZXBpcmF0ZWJheS5vcmcKIS0tfHx0aGVwaXJhdGViYXkuc2UKfHx0aGVwb3J0YWx3 +aWtpLmNvbQp0aGVyZWFsbG92ZS5rcgp0aGVyb2NrLm5ldC5uegp0aGVzcGVlZGVy +LmNvbQp8fHRoZXN0YW5kbmV3cy5jb20KdGhldGliZXRjZW50ZXIub3JnCnRoZXRp +YmV0Y29ubmVjdGlvbi5vcmcKLnRoZXRpYmV0bXVzZXVtLm9yZwoudGhldGliZXRw +b3N0LmNvbQp8fHRoZXRpYmV0cG9zdC5jb20KIS0tVG9yCnx8dGhldGluaGF0LmNv +bQp0aGV0cm90c2t5bW92aWUuY29tCnRoZXZpdmVrc3BvdC5jb20KfHx0aGV3Z28u +b3JnCi50aGV5bmMuY29tCnxodHRwOi8vdGhleW5jLmNvbQoudGhpbmtpbmd0YWl3 +YW4uY29tCi50aGlzYXYuY29tCnxodHRwOi8vdGhpc2F2LmNvbQoudGhsaWIub3Jn +Cnx8dGhvbWFzYmVybmhhcmQub3JnCi50aG9uZ2RyZWFtcy5jb20KdGhyZWF0Y2hh +b3MuY29tCnx8dGhyb3VnaG5pZ2h0c2ZpcmUuY29tCi50aHVtYnppbGxhLmNvbQp8 +fHRoeXdvcmRzLmNvbQoudGh5d29yZHMuY29tLnR3CnRpYW5hbm1lbm1vdGhlci5v +cmcKLnRpYW5hbm1lbmR1aXpoaS5jb20KfHx0aWFuYW5tZW5kdWl6aGkuY29tCnx8 +dGlhbmFubWVudW5pdi5jb20KfHx0aWFuYW5tZW51bml2Lm5ldAp8fHRpYW5kaXhp +bmcub3JnCi50aWFuaHVheXVhbi5jb20KLnRpYW5sYXdvZmZpY2UuY29tCnx8dGlh +bnRpLmlvCnRpYW50aWJvb2tzLm9yZwp8fHRpYW50aWJvb2tzLm9yZwp0aWFueWFu +dG9uZy5vcmcuY24KLnRpYW56aHUub3JnCi50aWJldC5hdAp0aWJldC5jYQoudGli +ZXQuY29tCnx8dGliZXQuY29tCnRpYmV0LmZyCi50aWJldC5uZXQKfHx0aWJldC5u +ZXQKdGliZXQubnUKLnRpYmV0Lm9yZwp8fHRpYmV0Lm9yZwoudGliZXQuc2sKdGli +ZXQub3JnLnR3Ci50aWJldC50bwoudGliZXQtZW52b3kuZXUKfHx0aWJldC1lbnZv +eS5ldQoudGliZXQtZm91bmRhdGlvbi5vcmcKLnRpYmV0LWhvdXNlLXRydXN0LmNv +LnVrCnRpYmV0LWluZm8ubmV0CnRpYmV0LWluaXRpYXRpdmUuZGUKfHx0aWJldC1p +bml0aWF0aXZlLmRlCi50aWJldC1tdW5pY2guZGUKLnRpYmV0M3JkcG9sZS5vcmcK +fGh0dHA6Ly90aWJldDNyZHBvbGUub3JnCnRpYmV0YWN0aW9uLm5ldAp8fHRpYmV0 +YWN0aW9uLm5ldAoudGliZXRhaWQub3JnCnRpYmV0YWxrLmNvbQoudGliZXRhbi5m +cgp0aWJldGFuLWFsbGlhbmNlLm9yZwoudGliZXRhbmFydHMub3JnCi50aWJldGFu +YnVkZGhpc3RpbnN0aXR1dGUub3JnCnxodHRwOi8vdGliZXRhbmJ1ZGRoaXN0aW5z +dGl0dXRlLm9yZwp0aWJldGFuY29tbXVuaXR5Lm9yZwoudGliZXRhbmpvdXJuYWwu +Y29tCi50aWJldGFubGFuZ3VhZ2Uub3JnCi50aWJldGFubGliZXJhdGlvbi5vcmcK +fHx0aWJldGFubGliZXJhdGlvbi5vcmcKLnRpYmV0Y29sbGVjdGlvbi5jb20KLnRp +YmV0YW5haWRwcm9qZWN0Lm9yZwoudGliZXRhbmNvbW11bml0eXVrLm5ldAp8aHR0 +cDovL3RpYmV0YW5jb21tdW5pdHl1ay5uZXQKdGliZXRhbmN1bHR1cmUub3JnCnRp +YmV0YW5mZW1pbmlzdGNvbGxlY3RpdmUub3JnCi50aWJldGFucGFpbnRpbmdzLmNv +bQoudGliZXRhbnBob3RvcHJvamVjdC5jb20KLnRpYmV0YW5wb2xpdGljYWxyZXZp +ZXcub3JnCi50aWJldGFucmV2aWV3Lm5ldAp8aHR0cDovL3RpYmV0YW5zcG9ydHMu +b3JnCi50aWJldGFud29tZW4ub3JnCnxodHRwOi8vdGliZXRhbndvbWVuLm9yZwou +dGliZXRhbnlvdXRoLm9yZwoudGliZXRhbnlvdXRoY29uZ3Jlc3Mub3JnCnx8dGli +ZXRhbnlvdXRoY29uZ3Jlc3Mub3JnCi50aWJldGNoYXJpdHkuZGsKdGliZXRjaGFy +aXR5LmluCi50aWJldGNoaWxkLm9yZwoudGliZXRjaXR5LmNvbQoudGliZXRjb3Jw +cy5vcmcKLnRpYmV0ZXhwcmVzcy5uZXQKfGh0dHA6Ly90aWJldGV4cHJlc3MubmV0 +CnRpYmV0Zm9jdXMuY29tCnRpYmV0ZnVuZC5vcmcKLnRpYmV0Z2VybWFueS5jb20K +fHx0aWJldGdlcm1hbnkuZGUKLnRpYmV0aGF1cy5jb20KLnRpYmV0aGVyaXRhZ2Vm +dW5kLm9yZwp0aWJldGhvdXNlLmpwCnRpYmV0aG91c2Uub3JnCnx8dGliZXRob3Vz +ZS51cwoudGliZXRpbmZvbmV0Lm5ldAoudGliZXRqdXN0aWNlLm9yZwoudGliZXRr +b21pdGUuZGsKfGh0dHA6Ly90aWJldG11c2V1bS5vcmcKdGliZXRuZXR3b3JrLm9y +Zwp8fHRpYmV0bmV0d29yay5vcmcKLnRpYmV0b2ZmaWNlLmNoCnxodHRwOi8vdGli +ZXRvZmZpY2UuY2gKdGliZXRvZmZpY2UuZXUKdGliZXRvZmZpY2Uub3JnCnRpYmV0 +b25saW5lLmNvbQp8fHRpYmV0b25saW5lLmNvbQoudGliZXRvZmZpY2UuY29tLmF1 +CnxodHRwOi8vdGliZXRvZmZpY2UuY29tLmF1Cnx8dGliZXRvbmxpbmUudHYKLnRp +YmV0b25saW5lLnR2Ci50aWJldG9yYWxoaXN0b3J5Lm9yZwp8aHR0cDovL3RpYmV0 +b3JhbGhpc3Rvcnkub3JnCi50aWJldHBvbGljeS5ldQoudGliZXRyZWxpZWZmdW5k +LmNvLnVrCnRpYmV0c2l0ZXMuY29tCi50aWJldHNvY2lldHkuY29tCnx8dGliZXRz +b2NpZXR5LmNvbQoudGliZXRzdW4uY29tCi50aWJldHN1cHBvcnRncm91cC5vcmcK +fGh0dHA6Ly90aWJldHN1cHBvcnRncm91cC5vcmcKLnRpYmV0c3dpc3MuY2gKLnRp +YmV0dGVsZWdyYXBoLmNvbQp0aWJldHRpbWVzLm5ldAp8fHRpYmV0d3JpdGVzLm9y +ZwoudGlja2V0LmNvbS50dwoudGlnZXJ2cG4uY29tCnx8dGlnZXJ2cG4uY29tCi50 +aW1kaXIuY29tCnxodHRwOi8vdGltZGlyLmNvbQoudGltZS5jb20KfGh0dHA6Ly90 +aW1lLmNvbQohLS0udGltZS5jb20vdGltZS90aW1lMTAwL2xlYWRlcnMvcHJvZmls +ZS9yZWJlbAohLS0udGltZS5jb20vdGltZS9zcGVjaWFscy9wYWNrYWdlcy9hcnRp +Y2xlLzAsMjg4MDQKIS0tLnRpbWUuY29tL3RpbWUvbWFnYXppbmUKLnRpbXNhaC5j +b20KfHxibG9nLnRpbmV5LmNvbQp0aW50dWMxMDEuY29tCi50aW55LmNjCnxodHRw +Oi8vdGlueS5jYwp0aW55Y2hhdC5jb20KfHx0aW55cGFzdGUuY29tCi50aXN0b3J5 +LmNvbQp8fHRrY3MtY29sbGlucy5jb20KLnRtYWdhemluZS5jb20KfHx0bWFnYXpp +bmUuY29tCi50bWRmaXNoLmNvbQp8aHR0cDovL3RtaS5tZQoudG1wcC5vcmcKfGh0 +dHA6Ly90bXBwLm9yZwoudG5hZmxpeC5jb20KfHx0bmFmbGl4LmNvbQoudG5ncm5v +dy5jb20KLnRuZ3Jub3cubmV0Ci50bnAub3JnCnxodHRwOi8vdG5wLm9yZwoudG8t +cG9ybm8uY29tCnx8dG8tcG9ybm8uY29tCnRvZ2V0dGVyLmNvbQoudG9reW8tMjQ3 +LmNvbQoudG9reW8taG90LmNvbQp8fHRva3lvLXBvcm4tdHViZS5jb20KfHx0b2t5 +b2NuLmNvbQp0dy50b21vbmV3cy5uZXQKLnRvbmdpbC5vci5rcgoudG9uby1va2Eu +anAKdG9ueXlhbi5uZXQKLnRvb2RvYy5jb20KdG9vbmVsLm5ldAp0b3A4MS53cwou +dG9wbmV3cy5pbgoudG9wcG9ybnNpdGVzLmNvbQp8aHR0cDovL3RvcHBvcm5zaXRl +cy5jb20KLnRvcmd1YXJkLm5ldAp8fHRvcmd1YXJkLm5ldAp8fHRvcC50dgoudG9w +c2hhcmV3YXJlLmNvbQoudG9wc3kuY29tCnx8dG9wc3kuY29tCnx8dG9wdGlwLmNh +CnRvcmEudG8KLnRvcmNuLmNvbQoudG9ycHJvamVjdC5vcmcKfHx0b3Jwcm9qZWN0 +Lm9yZwp0b3JyZW50cHJpdmFjeS5jb20KfHx0b3JyZW50cHJpdmFjeS5jb20KfGh0 +dHA6Ly90b3JyZW50cHJvamVjdC5zZQp8fHRvcnJlbnR5Lm9yZwp8fHRvcnJlbnR6 +LmV1Cnx8dG9ydnBuLmNvbQp8fHRvdGFsdnBuLmNvbQoudG91dGlhb2FiYy5jb20K +dG93bmdhaW4uY29tCnRveXBhcmsuaW4KdG95dHJhY3RvcnNob3cuY29tCi50cGFy +ZW50cy5vcmcKLnRwaS5vcmcudHcKfHx0cGkub3JnLnR3CnRyYWZmaWNoYXVzLmNv +bQp8fHRyYW5zcGFyZW5jeS5vcmcKfHx0cmVlbWFsbC5jb20udHcKdHJlbmRzbWFw +LmNvbQp8fHRyZW5kc21hcC5jb20KLnRyaWFsb2ZjY3Aub3JnCnx8dHJpYWxvZmNj +cC5vcmcKLnRyaW1vbmRpLmRlL1NETEUKLnRyb3V3Lm5sCnxodHRwOi8vdHJvdXcu +bmwKLnRydC5uZXQudHIKdHJ0Yy5jb20udHcKLnRydWVidWRkaGEtbWQub3JnCnxo +dHRwOi8vdHJ1ZWJ1ZGRoYS1tZC5vcmcKdHJ1bHllcmdvbm9taWMuY29tCi50cnV0 +aDEwMS5jby50dgp8aHR0cDovL3RydXRoMTAxLmNvLnR2Ci50cnV0aG9udG91ci5v +cmcKfGh0dHA6Ly90cnV0aG9udG91ci5vcmcKLnRydXZlby5jb20KLnRzY3R2Lm5l +dAoudHNlbXR1bGt1LmNvbQp0c3F1YXJlLnR2Ci50c3Uub3JnLnR3CnRzdW5hZ2Fy +dW1vbi5jb20KIS0tfGh0dHA6Ly93d3cudHN1cnUtYmlyZC5uZXQvCi50c2N0di5u +ZXQKfHx0dC1yc3Mub3JnCnx8dHQxMDY5LmNvbQoudHR0YW4uY29tCnx8dHR0YW4u +Y29tCmJiLnR0di5jb20udHcvYmIKdHU4OTY0LmNvbQoudHViYWhvbGljLmNvbQou +dHViZS5jb20KdHViZTguY29tCnx8dHViZTguY29tCi50dWJlOTExLmNvbQp8fHR1 +YmU5MTEuY29tCi50dWJlY3VwLmNvbQoudHViZWdhbHMuY29tCi50dWJlaXNsYW0u +Y29tCnxodHRwOi8vdHViZWlzbGFtLmNvbQoudHViZXN0YWNrLmNvbQp8fHR1YmV3 +b2xmLmNvbQoudHVpYmVpdHUubmV0CnR1aWRhbmcubmV0Ci50dWlkYW5nLm9yZwp8 +fHR1aWRhbmcub3JnCi50dWlkYW5nLnNlCmJicy50dWl0dWkuaW5mbwoudHVtdXRh +bnppLmNvbQp8aHR0cDovL3R1bXV0YW56aS5jb20KfHx0dW12aWV3LmNvbQoudHVu +ZWluLmNvbQp8aHR0cDovL3R1bmVpbi5jb20KfHx0dW5uZWxiZWFyLmNvbQoudHVu +bmVsci5jb20KfHx0dW5uZWxyLmNvbQoudHVvOC5ibHVlCnx8dHVvOC5ibHVlCi50 +dW84LmNjCi50dW84LmNsdWIKfHx0dW84LmNsdWIKLnR1bzguZml0Ci50dW84Lmhr +Ci50dW84LmluCi50dW84Lm5pbmphCi50dW84Lm9yZwp8fHR1bzguZml0Cnx8dHVv +OC5vcmcKLnR1bzgucHcKfGh0dHA6Ly90dW84LnB3Cnx8dHVvOC5yZWQKLnR1bzgu +c3BhY2UKdHVpdHdpdC5jb20KLnR1cmFuc2FtLm9yZwoudHVyYm9iaXQubmV0Cnxo +dHRwOi8vdHVyYm9iaXQubmV0Ci50dXJib2hpZGUuY29tCnx8dHVyYm9oaWRlLmNv +bQoudHVzaHljYXNoLmNvbQp8aHR0cDovL3R1c2h5Y2FzaC5jb20KfHxhcHAudHV0 +YW5vdGEuY29tCi50dXZwbi5jb20KfHx0dXZwbi5jb20KfGh0dHA6Ly90dXphaWpp +ZGkuY29tCnxodHRwOi8vKi50dXphaWppZGkuY29tCi50dzAxLm9yZwp8aHR0cDov +L3R3MDEub3JnCgohLS0tVHVtYmxyLS0tCi50dW1ibHIuY29tCnx8dHVtYmxyLmNv +bQohLS1AQHx8YXNzZXRzLnR1bWJsci5jb20KIS0tQEB8fGRhdGEudHVtYmxyLmNv +bQohLS1AQHx8bWVkaWEudHVtYmxyLmNvbQohLS1AQHx8c3RhdGljLnR1bWJsci5j +b20KIS0tQEB8fHd3dy50dW1ibHIuY29tCnx8bGVjbG91ZC5uZXQKfGh0dHA6Ly9j +b3NtaWMubW9uYXIuY2gKfHxzbHV0bW9vbmJlYW0uY29tCnxodHRwOi8vYmxvZy5z +b3lsZW50LmNvbQoKLnR2LmNvbQp8aHR0cDovL3R2LmNvbQp0dmFudHMuY29tCmZv +cnVtLnR2Yi5jb20KbmV3cy50dmIuY29tL2xpc3Qvd29ybGQKbmV3cy50dmIuY29t +L2xvY2FsCm5ld3MudHZicy5jb20udHcKLnR2Ym94bm93LmNvbQp8aHR0cDovL3R2 +Ym94bm93LmNvbS8KdHZpZGVyLmNvbQoudHZtb3N0LmNvbS5oawoudHZwbGF5dmlk +ZW9zLmNvbQp8fHR2dW5ldHdvcmtzLmNvbQoudHctYmxvZy5jb20KfGh0dHBzOi8v +dHctYmxvZy5jb20KLnR3LW5wby5vcmcKLnR3YWl0dGVyLmNvbQp0d2FwcGVya2Vl +cGVyLmNvbQp8fHR3YXBwZXJrZWVwZXIuY29tCnx8dHdhdWQuaW8KLnR3YXVkLmlv +Ci50d2F2aS5jb20KLnR3YmJzLm5ldC50dwp0d2Jicy5vcmcKdHdiYnMudHcKfHx0 +d2Jsb2dnZXIuY29tCnR3ZWVwbWFnLmNvbQoudHdlZXBtbC5vcmcKfHx0d2VlcG1s +Lm9yZwoudHdlZXRiYWNrdXAuY29tCnx8dHdlZXRiYWNrdXAuY29tCnR3ZWV0Ym9h +cmQuY29tCnx8dHdlZXRib2FyZC5jb20KLnR3ZWV0Ym9uZXIuYml6Cnx8dHdlZXRi +b25lci5iaXoKLnR3ZWV0Y3MuY29tCnxodHRwOi8vdHdlZXRjcy5jb20KfGh0dHA6 +Ly9kZWNrLmx5CiEtLSBPcGVyYXRpb24gZGlzY29udGludWVkCiEtLXx8dHdlZXRl +Lm5ldAohLS1tLnR3ZWV0ZS5uZXQKfHxtdHcudGwKfHx0d2VldGVkdGltZXMuY29t +CiEtLSBPcGVyYXRpb24gZGlzY29udGludWVkCiEtLXR3ZWV0bWVtZS5jb20KfHx0 +d2VldG15bGFzdC5mbQp0d2VldHBob3RvLmNvbQp8fHR3ZWV0cGhvdG8uY29tCnx8 +dHdlZXRyYW5zLmNvbQp0d2VldHJlZS5jb20KfHx0d2VldHJlZS5jb20KLnR3ZWV0 +dHVubmVsLmNvbQp8fHR3ZWV0dHVubmVsLmNvbQp8fHR3ZWV0d2FsbHkuY29tCnR3 +ZWV0eW1haWwuY29tCnx8dHdlbHZlLnRvZGF5Ci50d2Vlei5uZXQKfGh0dHA6Ly90 +d2Vlei5uZXQKfHx0d2Z0cC5vcmcKfHx0d2dyZWF0ZGFpbHkuY29tCnR3aWJhc2Uu +Y29tCi50d2liYmxlLmRlCnx8dHdpYmJsZS5kZQp0d2liYm9uLmNvbQp8fHR3aWJz +LmNvbQp0d2ljc3kuY29tCi50d2llbmRzLmNvbQp8aHR0cDovL3R3aWVuZHMuY29t +Ci50d2lmYW4uY29tCnxodHRwOi8vdHdpZmFuLmNvbQp0d2lmZm8uY29tCnx8dHdp +ZmZvLmNvbQoudHdpbGlnaHRzZXguY29tCnR3aWxvZy5vcmcKdHdpbWJvdy5jb20K +fHx0d2luZGV4eC5jb20KdHdpcHBsZS5qcAp8fHR3aXBwbGUuanAKfHx0d2lwLm1l +CnR3aXNob3J0LmNvbQp8fHR3aXNob3J0LmNvbQp0d2lzdGFyLmNjCnx8dHdpc3Rl +ci5uZXQuY28KfHx0d2lzdGVyaW8uY29tCnR3aXN0ZXJub3cuY29tCnR3aXN0b3J5 +Lm5ldAp0d2l0YnJvd3Nlci5uZXQKfHx0d2l0Y2F1c2UuY29tCnx8dHdpdGdldGhl +ci5jb20KfHx0d2lnZ2l0Lm9yZwp0d2l0Z29vLmNvbQp0d2l0aXEuY29tCnx8dHdp +dGlxLmNvbQoudHdpdGxvbmdlci5jb20KfHx0d2l0bG9uZ2VyLmNvbQp8aHR0cDov +L3RsLmdkLwp0d2l0bWFuaWEuY29tCnR3aXRvYXN0ZXIuY29tCnx8dHdpdG9hc3Rl +ci5jb20KfHx0d2l0b25tc24uY29tCiEtLVNhbWUgSVAKLnR3aXQyZC5jb20KfHx0 +d2l0MmQuY29tCi50d2l0c3RhdC5jb20KfHx0d2l0c3RhdC5jb20KfHxmaXJzdGZp +dmVmb2xsb3dlcnMuY29tCnx8cmV0d2VldGVmZmVjdC5jb20KfHx0d2VlcGxpa2Uu +bWUKfHx0d2VlcGd1aWRlLmNvbQp8fHR1cmJvdHdpdHRlci5jb20KLnR3aXR2aWQu +Y29tCnx8dHdpdHZpZC5jb20KfGh0dHA6Ly90d3QudGwKdHdpdHRib3QubmV0Cnx8 +YWRzLXR3aXR0ZXIuY29tCnx8dHd0dHIuY29tCnx8dHdpdHRlcjRqLm9yZwoudHdp +dHRlcmNvdW50ZXIuY29tCnx8dHdpdHRlcmNvdW50ZXIuY29tCnR3aXR0ZXJmZWVk +LmNvbQoudHdpdHRlcmdhZGdldC5jb20KfHx0d2l0dGVyZ2FkZ2V0LmNvbQoudHdp +dHRlcmtyLmNvbQp8fHR3aXR0ZXJrci5jb20KfHx0d2l0dGVybWFpbC5jb20KfHx0 +d2l0dGVycmlmaWMuY29tCnR3aXR0ZXJ0aW0uZXMKfHx0d2l0dGVydGltLmVzCnR3 +aXR0aGF0LmNvbQp8fHR3aXR0dXJrLmNvbQoudHdpdHR1cmx5LmNvbQp8fHR3aXR0 +dXJseS5jb20KLnR3aXR6YXAuY29tCnR3aXlpYS5jb20KfHx0d3N0YXIubmV0Ci50 +d3Rrci5jb20KfGh0dHA6Ly90d3Rrci5jb20KLnR3bm9ydGgub3JnLnR3CnR3c2t5 +cGUuY29tCnR3dHJsYW5kLmNvbQp0d3VybC5ubAoudHd5YWMub3JnCnx8dHd5YWMu +b3JnCi50eHh4LmNvbQoudHljb29sLmNvbQp8fHR5Y29vbC5jb20KCiEtLXR5cGVw +YWQKfHx0eXBlcGFkLmNvbQpAQHx8d3d3LnR5cGVwYWQuY29tCkBAfHxzdGF0aWMu +dHlwZXBhZC5jb20KfHxibG9nLmV4cG9mdXR1cmVzLmNvbQp8fGxlZ2FsdGVjaC5s +YXcuY29tCnx8YmxvZ3MudGFtcGFiYXkuY29tCnx8Y29udGVzdHMudHdpbGlvLmNv +bQohLWxhd3Byb2Zlc3NvcnMudHlwZXBhZC5jb20vY2hpbmFfbGF3X3Byb2YKCiEt +LS0tLS0tLS0tLS0tVHdpdGVzZS0tLS0tCi5lbWJyLmluCnx8ZW1ici5pbgoKIS0t +LS0tLS0tLS0tLS0tLS0tLS0tVVUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi51 +OXVuLmNvbQp8fHU5dW4uY29tCi51YmRkbnMub3JnCnxodHRwOi8vdWJkZG5zLm9y +Zwp8fHViZXJwcm94eS5uZXQKLnVjLWphcGFuLm9yZwp8fHVjLWphcGFuLm9yZwou +c3JjZi51Y2FtLm9yZy9zYWxvbi8KfGh0dHA6Ly9jaGluYS51Y2FuZXdzLmNvbS8K +fHx1Y2RjMTk5OC5vcmcKfGh0dHA6Ly9odW0qLnVjaGljYWdvLmVkdS9mYWN1bHR5 +L3l3YW5nL2hpc3RvcnkKfHx1ZGVyem8uaXQKLnVkbi5jb20KfHx1ZG4uY29tCnx8 +dWRuLmNvbS50dwp1ZG5ia2suY29tL2Jicwp8fHVmb3JhZGlvLmNvbS50dwp1ZnJl +ZXZwbi5jb20KLnVnby5jb20KIS0tZ2hzCnx8dWhkd2FsbHBhcGVycy5vcmcKfHx1 +aHJwLm9yZwoudWlnaHVyLm5sCnx8dWlnaHVyLm5sCnVpZ2h1cmJpei5uZXQKLnVs +aWtlLm5ldAp1a2NkcC5jby51awp1a2xpZmVyYWRpby5jby51awp8fHVrbGlmZXJh +ZGlvLmNvLnVrCnVsdHJhdnBuLmZyCnx8dWx0cmF2cG4uZnIKdWx0cmF4cy5jb20K +dW1pY2guZWR1L35mYWx1bgp8fHVuYmxvY2suY24uY29tCi51bmJsb2NrZXIueXQK +dW5ibG9jay11cy5jb20KfHx1bmJsb2NrLXVzLmNvbQoudW5ibG9ja2RtbS5jb20K +fGh0dHA6Ly91bmJsb2NrZG1tLmNvbQp8fHVuYmxvY2tzaXQuZXMKdW5jeWNsb21l +ZGlhLm9yZwoudW5jeWNsb3BlZGlhLmhrL3dpa2kKfGh0dHA6Ly91bmN5Y2xvcGVk +aWEuaGsKIS0tdW5jeWNsb3BlZGlhLmluZm8KfGh0dHA6Ly91bmN5Y2xvcGVkaWEu +dHcKdW5kZXJ3b29kYW1tby5jb20KfHx1bmRlcndvb2RhbW1vLmNvbQp8fHVuaG9s +eWtuaWdodC5jb20KLnVuaS5jYwp8fGNsZHIudW5pY29kZS5vcmcKLnVuaWZpY2F0 +aW9uLm5ldAoudW5pZmljYXRpb24ub3JnLnR3Ci51bml0ZWRzb2NpYWxwcmVzcy5j +b20KLnVuaXgxMDAuY29tCnx8dW5rbm93bnNwYWNlLm9yZwoudW5vZGVkb3MuY29t +CnVucG8ub3JnCi51bnRyYWNlYWJsZS51cwp8aHR0cDovL3VudHJhY2VhYmxlLnVz +Cnx8dW9jbi5vcmcKdG9yLnVwZGF0ZXN0YXIuY29tCi51cGhvbGRqdXN0aWNlLm9y +ZwoudXBsb2FkNHUuaW5mbwp1cGxvYWRlZC5uZXQvZmlsZQp8aHR0cDovL3VwbG9h +ZGVkLm5ldC9maWxlCnxodHRwOi8vdXBsb2FkZWQudG8vZmlsZQoudXBsb2Fkc3Rh +dGlvbi5jb20vZmlsZQoudXBtZWRpYS5tZwoudXBvcm5pYS5jb20KfGh0dHA6Ly91 +cG9ybmlhLmNvbQp8fHVwcm94eS5vcmcKfGh0dHA6Ly90b3IuY24udXB0b2Rvd24u +Y29tLwoudXB3aWxsLm9yZwp1cjdzLmNvbQp8fHVyYmFuc3Vydml2YWwuY29tCm15 +c2hhcmUudXJsLmNvbS50dy8KfHx1cmxib3JnLmNvbQp8fHVybHBhcnNlci5jb20K +dXMudG8KfHx1c2Fjbi5jb20KLnVzYWlwLmV1Cnx8dXNhaXAuZXUKZGFsYWlsYW1h +LnVzYy5lZHUKYmV0YS51c2VqdW1wLmNvbQp8fHVzZmsubWlsCnx8dXNtYS5lZHUK +fHx1c21jLm1pbAoudXNvY2N0bi5jb20KfGh0dHA6Ly90YXJyLnVzcHRvLmdvdi8K +fHx0c2RyLnVzcHRvLmdvdgoudXN0cmVhbS50dgp8fHVzdHJlYW0udHYKIS0tfHx1 +c3R3cmFwLmluZm8KLnVzdW5pdGVkbmV3cy5jb20KfGh0dHA6Ly91c3VuaXRlZG5l +d3MuY29tCnVzdXMuY2MKLnV0b3BpYW5wYWwuY29tCnx8dXRvcGlhbnBhbC5jb20K +LnV1LWdnLmNvbQoudXZ3eHl6Lnh5egp8fHV2d3h5ei54eXoKLnV3YW50cy5jb20K +LnV3YW50cy5uZXQKdXlnaHVyLmNvLnVrCnxodHRwOi8vdXlnaHVyLWoub3JnCnx8 +dXlnaHVyYW1lcmljYW4ub3JnCi51eWdodXJjYW5hZGlhbnNvY2lldHkub3JnCi51 +eWdodXJlbnNlbWJsZS5jby51awp8fHV5Z2h1cmNvbmdyZXNzLm9yZwoudXlnaHVy +cGVuLm9yZwoudXlnaHVycHJlc3MuY29tCi51eWdodXJzdHVkaWVzLm9yZwp8aHR0 +cDovL3V5Z2h1cnN0dWRpZXMub3JnCnV5Z3VyLm9yZwp8aHR0cDovL3V5bWFhcmlw +LmNvbS8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLVZWLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLQoudjJyYXkuY29tCnxodHRwOi8vdjJyYXkuY29tCi52YW4wMDEuY29t +Ci52YW42OTguY29tCi52YW5lbXUuY24KLnZhbmlsbGEtanAuY29tCi52YW5wZW9w +bGUuY29tCnZhbnNreS5jb20KfHx2Y2Ytb25saW5lLm9yZwp8fHZjZmJ1aWxkZXIu +b3JnCi52ZWdhc3JlZC5jb20KLnZlbGthZXBvY2hhLnNrCi52ZW5iYnMuY29tCi52 +ZW5jaGluYS5jb20KLnZlbmV0aWFubWFjYW8uY29tCnx8dmVuZXRpYW5tYWNhby5j +b20KdmVvaC5jb20KbXlzaXRlLnZlcml6b24ubmV0CnZlcm1vbnR0aWJldC5vcmcK +LnZlcnNhdnBuLmNvbQp8fHZlcnNhdnBuLmNvbQp8fHZlcnlicy5jb20KLnZmdC5j +b20udHcKLnZpYmVyLmNvbQp8fHZpYmVyLmNvbQoudmljYS5pbmZvCi52aWN0aW1z +b2Zjb21tdW5pc20ub3JnCnxodHRwOi8vdmljdGltc29mY29tbXVuaXNtLm9yZwp8 +fHZpZC5tZQp8fHZpZGJsZS5jb20KdmlkZW9iYW0uY29tCnx8dmlkZW9iYW0uY29t +Ci52aWRlb2RldGVjdGl2ZS5jb20KLnZpZGVvbWVnYS50dgp8fHZpZGVvbWVnYS50 +dgoudmlkZW9tby5jb20KdmlkZW9wZWRpYXdvcmxkLmNvbQoudmlkZW9wcmVzcy5j +b20KLnZpZGluZm8ub3JnL3ZpZGVvCnZpZXRkYWlreW5ndXllbi5jb20KLnZpamF5 +YXRlbXBsZS5vcmcKdmltZW8uY29tCnx8dmltZW8uY29tCnx8dmltcGVyYXRvci5v +cmcKfHx2aW5jbmQuY29tCnx8dmlubmlldi5jb20KfGh0dHA6Ly93d3cubGliLnZp +cmdpbmlhLmVkdS9hcmVhLXN0dWRpZXMvVGliZXQvdGliZXQuaHRtbAp2aXNpYmxl +dHdlZXRzLmNvbQp8aHR0cDovL255LnZpc2lvbnRpbWVzLmNvbQoudml0YWwyNDcu +b3JnCnx8dml1LmNvbQoudml2YWhlbnRhaTR1Lm5ldAoudml2YXR1YmUuY29tCi52 +aXZ0aG9tYXMuY29tCnx8dml2dGhvbWFzLmNvbQoudmptZWRpYS5jb20uaGsKLnZs +bGNzLm9yZwp8aHR0cDovL3ZsbGNzLm9yZwp8fHZtaXhjb3JlLmNvbQp8fHZuZXQu +bGluawpjbi52b2EubW9iaQp0dy52b2EubW9iaQoudm9hY2hpbmVzZWJsb2cuY29t +Cnx8dm9hY2hpbmVzZWJsb2cuY29tCnZvYWdkLmNvbQoudm9hY2FudG9uZXNlLmNv +bQp8fHZvYWNhbnRvbmVzZS5jb20Kdm9hY2hpbmVzZS5jb20KfHx2b2FjaGluZXNl +LmNvbQoudm9hbmV3cy5jb20KfHx2b2FuZXdzLmNvbQp2b2F0aWJldGFuLmNvbQp8 +fHZvYXRpYmV0YW4uY29tCi52b2F0aWJldGFuZW5nbGlzaC5jb20KfHx2b2F0aWJl +dGFuZW5nbGlzaC5jb20KLnZvY2F0aXYuY29tCnZvY24udHYKLnZvdC5vcmcKfHx2 +b3Qub3JnCi52b3ZvMjAwMC5jb20KfGh0dHA6Ly92b3ZvMjAwMC5jb20KLnZveGVy +LmNvbQp8fHZveGVyLmNvbQoudm95LmNvbQp8fHZwbi5hYwoudnBuNGFsbC5jb20K +fHx2cG40YWxsLmNvbQoudnBuYWNjb3VudC5vcmcKfGh0dHA6Ly92cG5hY2NvdW50 +Lm9yZwoudnBuYWNjb3VudHMuY29tCnx8dnBuYWNjb3VudHMuY29tCi52cG5jb21w +YXJpc29uLm9yZwoudnBuY3VwLmNvbQp8fHZwbmN1cC5jb20KdnBuYm9vay5jb20K +LnZwbmNvdXBvbnMuY29tCnxodHRwOi8vdnBuY291cG9ucy5jb20KLnZwbmRhZGEu +Y29tCnx8dnBuZGFkYS5jb20KLnZwbmZhbi5jb20KdnBuZmlyZS5jb20KLnZwbmZp +cmVzLmJpegoudnBuZm9yZ2FtZS5uZXQKfHx2cG5mb3JnYW1lLm5ldAp8fHZwbmdh +dGUuanAKLnZwbmdhdGUubmV0Cnx8dnBuZ2F0ZS5uZXQKLnZwbmdyYXRpcy5uZXQK +dnBuaHEuY29tCi52cG5tYXN0ZXIuY29tCnx8dnBubWFzdGVyLmNvbQoudnBubWVu +dG9yLmNvbQp8fHZwbm1lbnRvci5jb20KLnZwbmluamEubmV0Cnx8dnBuaW5qYS5u +ZXQKLnZwbmludG91Y2guY29tCnx8dnBuaW50b3VjaC5uZXQKdnBuamFjay5jb20K +fHx2cG5qYWNrLmNvbQoudnBucGljay5jb20KfHx2cG5waWNrLmNvbQp8fHZwbnBv +cC5jb20KfHx2cG5wcm9uZXQuY29tCi52cG5yZWFjdG9yLmNvbQp8fHZwbnJlYWN0 +b3IuY29tCnx8dnBucmV2aWV3ei5jb20KLnZwbnNlY3VyZS5tZQp8fHZwbnNlY3Vy +ZS5tZQoudnBuc2hhemFtLmNvbQp8fHZwbnNoYXphbS5jb20KLnZwbnNoaWVsZGFw +cC5jb20KfHx2cG5zaGllbGRhcHAuY29tCi52cG5zcC5jb20KLnZwbnRyYWZmaWMu +Y29tCi52cG50dW5uZWwuY29tCnx8dnBudHVubmVsLmNvbQoudnBudWsuaW5mbwp8 +fHZwbnVrLmluZm8KfHx2cG51bmxpbWl0ZWRhcHAuY29tCi52cG52aXAuY29tCnx8 +dnBudmlwLmNvbQoudnBud29ybGR3aWRlLmNvbQoudnBvcm4uY29tCnx8dnBvcm4u +Y29tCi52cHNlci5uZXQKQEB8fHZwc2VyLm5ldAp2cmFpZXNhZ2Vzc2UubmV0Ci52 +cm10ci5jb20KfHx2dHVubmVsLmNvbQp8fHZ1a3UuY2MKCiEtLS0tLS0tLS0tLS0t +LS0tLS0tLVdXLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpsaXN0cy53My5vcmcv +YXJjaGl2ZXMvcHVibGljCnx8dzNzY2hvb2xzLmNvbQp8fHdhZmZsZTE5OTkuY29t +Ci53YWhhcy5jb20KLndhaWdhb2J1LmNvbQp3YWlrZXVuZy5vcmcvcGhwX3dpbmQK +LndhaWxhaWtlLm5ldAoud2Fpd2FpZXIuY29tCnxodHRwOi8vd2Fpd2FpZXIuY29t +Cnx8d2FsbG1hbWEuY29tCndhbGxvcm5vdC5vcmcKfHx3YWxscGFwZXJjYXNhLmNv +bQoud2FsbHByb3h5LmNvbQpAQHx8d2FsbHByb3h5LmNvbS5jbgp8fHdhbHRlcm1h +cnRpbi5jb20KfHx3YWx0ZXJtYXJ0aW4ub3JnCnx8d3d3Lndhbi1wcmVzcy5vcmcK +fHx3YW5kZXJpbmdob3JzZS5uZXQKfHx3YW5nYWZ1Lm5ldAp8fHdhbmdqaW5iby5v +cmcKLndhbmdqaW5iby5vcmcKd2FuZ2xpeGlvbmcuY29tCi53YW5nby5vcmcKfHx3 +YW5nby5vcmcKd2FuZ3J1b3NodWkubmV0Cnd3dy53YW5ncnVvd2FuZy5vcmcKd2Fu +dC1kYWlseS5jb20Kd2FwZWRpYS5tb2JpL3poc2ltcAp8fHdhc2VscHJvLmNvbQou +d2F0Y2hpbmVzZS5jb20KLndhdHRwYWQuY29tCnx8d2F0dHBhZC5jb20KLm1ha3po +b3Uud2FyZWhvdXNlMzMzLmNvbQp3YXNoZW5nLm5ldAoud2F0Y2g4eC5jb20KfHx3 +YXRjaG15Z2YubmV0Cnx8d2F2LnR2Ci53ZGY1LmNvbQoud2VhcmVoYWlyeS5jb20K +LndlYXJuLmNvbQp8fHdlYXJuLmNvbQp8aHR0cDovL2hrY29jLndlYXRoZXIuY29t +LmhrCnx8aHVkYXRvcmlxLndlYi5pZAp8fHdlYjJwcm9qZWN0Lm5ldAp3ZWJiYW5n +Lm5ldAoud2ViZXZhZGVyLm9yZwoud2ViZnJlZXIuY29tCndlYmxhZ3UuY29tCi53 +ZWJqYi5vcmcKLndlYnJ1c2gubmV0CndlYnMtdHYubmV0Ci53ZWJzaXRlcHVsc2Uu +Y29tL2hlbHAvdGVzdHRvb2xzLmNoaW5hLXRlc3QKfGh0dHA6Ly93d3cud2Vic25h +cHIuY29tCi53ZWJ3YXJwZXIubmV0CnxodHRwOi8vd2Vid2FycGVyLm5ldAp3ZWJ3 +b3JrZXJkYWlseS5jb20KLndlZWttYWcuaW5mbwp8fHdlZmlnaHRjZW5zb3JzaGlw +Lm9yZwoud2Vmb25nLmNvbQp3ZWlib2xlYWsuY29tCi53ZWlodW8ub3JnCndlaWpp +bmdzaGVuZy5vcmcKLndlaW1pbmcuaW5mbwp8fHdlaW1pbmcuaW5mbwp3ZWlxdWFu +d2FuZy5vcmcKfGh0dHA6Ly93ZWlzdW8ud3MKLndlbG92ZWNvY2suY29tCi53ZW1p +Z3JhdGUub3JnCnxodHRwOi8vd2VtaWdyYXRlLm9yZwp3ZW5nZXdhbmcuY29tCnx8 +d2VuZ2V3YW5nLm9yZwoud2VuaHVpLmNoCnxodHRwOi8vdHJhbnMud2Vud2VpcG8u +Y29tL2diLwoud2VueHVlY2l0eS5jb20KfHx3ZW54dWVjaXR5LmNvbQoud2VueXVu +Y2hhby5jb20KfHx3ZW55dW5jaGFvLmNvbQoud2VzdGNhLmNvbQp8fHdlc3RjYS5j +b20KfHx3ZXN0ZXJud29sdmVzLmNvbQoud2VzdGtpdC5uZXQKfHx3ZXN0cG9pbnQu +ZWR1Ci53ZXN0ZXJuc2h1Z2RlbnNvY2lldHkub3JnCndldHB1c3N5Z2FtZXMuY29t +Ci53ZXRwbGFjZS5jb20Kd2V4aWFvYm8ub3JnCnx8d2V4aWFvYm8ub3JnCndlemhp +eW9uZy5vcmcKfHx3ZXpvbmUubmV0Ci53Zm9ydW0uY29tCnx8d2ZvcnVtLmNvbS8K +LndoYXRibG9ja2VkLmNvbQp8fHdoYXRibG9ja2VkLmNvbQoud2hlYXRzZWVkcy5v +cmcKfHx3aGVlbG9ja3NsYXRpbi5jb20KLndoaXBwZWRhc3MuY29tCiEtLXxodHRw +Oi8vd2hvLmlzLwoud2hvZXIubmV0Cnx8d2hvZXIubmV0Cndob3RhbGtpbmcuY29t +CndoeWxvdmVyLmNvbQp8fHdoeXgub3JnCnxodHRwOi8vemguZWNkbS53aWtpYS5j +b20KfGh0dHA6Ly9ldmNoay53aWtpYS5jb20KZnEud2lraWEuY29tCmNuLnVuY3lj +bG9wZWRpYS53aWtpYS5jb20KemgudW5jeWNsb3BlZGlhLndpa2lhLmNvbQp8fHdp +a2lsZWFrcy5jaAp8fHdpa2lsZWFrcy5jb20KfHx3aWtpbGVha3MuZGUKfHx3aWtp +bGVha3MuZXUKfHx3aWtpbGVha3MubHUKLndpa2lsZWFrcy5vcmcKfHx3aWtpbGVh +a3Mub3JnCnx8d2lraWxlYWtzLnBsCi53aWtpbGVha3MtZm9ydW0uY29tCndpbGRh +bW1vLmNvbQp8fGNvbGxhdGVyYWxtdXJkZXIuY29tCnx8Y29sbGF0ZXJhbG11cmRl +ci5vcmcKd2lraWxpdnJlcy5pbmZvL3dpa2kvJUU5JTlCJUI2JUU1JTg1JUFCJUU1 +JUFFJUFBJUU3JUFCJUEwCnx8d2lraW1hcGlhLm9yZwoKIS0tLS0tLS0tLS0tLS1X +aWtpcGVkaWEgUmVsYXRlZC0tLS0tLS0tLS0tLS0KISFFbWVyZ2VuY3kgbmVlZCBv +bmx5KElQL1BvcnQgYmxvY2sgdXNhZ2UpISEKIS0tLS0tLTAtLS0tLS0KIS0tfHxt +ZWRpYXdpa2kub3JnCiEtLUBAfHxtLm1lZGlhd2lraS5vcmcKIS0tLS0tLTEtLS0t +LS0KIS0tfHx3aWtpZGF0YS5vcmcKIS0tQEB8fG0ud2lraWRhdGEub3JnCiEtLS0t +LS0yLS0tLS0tCiEtLXx8d2lraW1lZGlhLm9yZwohLS1AQHx8bGlzdHMud2lraW1l +ZGlhLm9yZwohLS1AQHx8bS53aWtpbWVkaWEub3JnCiEtLUBAfHxwaGFicmljYXRv +ci53aWtpbWVkaWEub3JnCiEtLUBAfHx1cGxvYWQud2lraW1lZGlhLm9yZwohLS1A +QHx8d2lraXRlY2gud2lraW1lZGlhLm9yZwohLS0tLS0tMy0tLS0tLQohLS18fHdp +a2lib29rcy5vcmcKIS0tQEB8fG0ud2lraWJvb2tzLm9yZwohLS0tLS0tNC0tLS0t +LQohLS18fHdpa2l2ZXJzaXR5Lm9yZwohLS1AQHx8bS53aWtpdmVyc2l0eS5vcmcK +IS0tLS0tLTUtLS0tLS0KIS0tfHx3aWtpc291cmNlLm9yZwohLS1AQHx8bS53aWtp +c291cmNlLm9yZwp8aHR0cDovL3poLndpa2lzb3VyY2Uub3JnCiEtLS0tLS02LS0t +LS0tCiEtLXx8d2lraXF1b3RlLm9yZwohLS1AQHx8bS53aWtpcXVvdGUub3JnCiEt +LS0tLS03LS0tLS0tCiEtLXx8d2lraW5ld3Mub3JnCiEtLUBAfHxtLndpa2luZXdz +Lm9yZwp8fHpoLndpa2luZXdzLm9yZwohLS0tLS0tOC0tLS0tLQohLS18fHdpa2l2 +b3lhZ2Uub3JnCiEtLUBAfHxtLndpa2l2b3lhZ2Uub3JnCiEtLXxodHRwOi8vemgu +d2lraXZveWFnZS5vcmcKIS0tLS0tLTktLS0tLS0KIS0tfHx3aWt0aW9uYXJ5Lm9y +ZwohLS1AQHx8bS53aWt0aW9uYXJ5Lm9yZwohLS18aHR0cDovL3poLndpa3Rpb25h +cnkub3JnCiEtLS0tLTEwLS0tLS0tCiEtLXx8d2lraW1lZGlhZm91bmRhdGlvbi5v +cmcKIS0tQEB8fG0ud2lraW1lZGlhZm91bmRhdGlvbi5vcmcKIS0tLS1NYWluLS0t +LS0KIS0tfHx3aWtpcGVkaWEub3JnCnx8amEud2lraXBlZGlhLm9yZwp6aC53aWtp +cGVkaWEub3JnCiEtLXx8emgud2lraXBlZGlhLm9yZwp6aC5tLndpa2lwZWRpYS5v +cmcKfGh0dHBzOi8vemgubS53aWtpcGVkaWEub3JnCiEtLUBAfHxtLndpa2lwZWRp +YS5vcmcKfGh0dHBzOi8vemgud2lraXBlZGlhLm9yZwohLS1PdGhlciBMYW5ndWFn +ZXMgb2YgV2lraXBlZGlhCnd1dS53aWtpcGVkaWEub3JnCnxodHRwczovL3d1dS53 +aWtpcGVkaWEub3JnCnpoLXl1ZS53aWtpcGVkaWEub3JnCnxodHRwczovL3poLXl1 +ZS53aWtpcGVkaWEub3JnCgp8fHdpa2l3aWtpLmpwCnx8Y2FzaW5vLndpbGxpYW1o +aWxsLmNvbQp8fHNwb3J0cy53aWxsaWFtaGlsbC5jb20KfHx2ZWdhcy53aWxsaWFt +aGlsbC5jb20KfHx3aWxsdy5uZXQKfHx3aW5kb3dzcGhvbmVtZS5jb20KLndpbmRz +Y3JpYmUuY29tCnx8d2luZHNjcmliZS5jb20KfHxjb21tdW5pdHkud2luZHkuY29t +Cnx8d2luZ3kuc2l0ZQp3aW5uaW5nMTEuY29tCndpbndoaXNwZXJzLmluZm8KfHx3 +aXJlZGJ5dGVzLmNvbQp8fHdpcmVkcGVuLmNvbQohLS18fHdpcmVzaGFyay5vcmcK +Lndpc2RvbXB1YnMub3JnCi53aXNldmlkLmNvbQp8fHdpc2V2aWQuY29tCi53aXRu +ZXNzbGVldGVhY2hpbmcuY29tCi53aXRvcGlhLm5ldAoud2piay5vcmcKfHx3amJr +Lm9yZwp8aHR0cDovL3duLmNvbQoud25hY2cuY29tCi53bmFjZy5vcmcKLndvLnRj +Cnx8d29lc2VyLmNvbQp8aHR0cDovL3dvZXNlcm1pZGRsZS13YXkubmV0Lwoud29r +YXIub3JnCnxodHRwOi8vd29rYXIub3JnCndvbGZheC5jb20KfHx3b2xmYXguY29t +Cnx8d29vbHlzcy5jb20Kd29vcGllLmpwCnx8d29vcGllLmpwCndvb3BpZS50dgp8 +fHdvb3BpZS50dgp8fHdvcmthdHJ1bmEuY29tCi53b3JrZXJkZW1vLm9yZy5oawp8 +fHdvcmtlcnN0aGViaWcubmV0Ci53b3JsZGNhdC5vcmcKd29ybGRqb3VybmFsLmNv +bQoud29ybGR2cG4ubmV0Cnx8d29ybGR2cG4ubmV0Cgp8fHZpZGVvcHJlc3MuY29t +Ci53b3JkcHJlc3MuY29tCnxodHRwOi8vKi53b3JkcHJlc3MuY29tCnx8Y2hlbnNo +YW4yMDA0MjAwNS53b3JkcHJlc3MuY29tCnx8Y2hpbmF2aWV3LndvcmRwcmVzcy5j +b20KfHxjbmJibmV3cy53b3JkcHJlc3MuY29tCnx8ZnJlZWRvbWluZm9uZXR3ZWIu +d29yZHByZXNzLmNvbQp8fGhrYTg5NjQud29yZHByZXNzLmNvbQp8fGhrYW5ld3Mu +d29yZHByZXNzLmNvbQp8fGhxc2JuZXQud29yZHByZXNzLmNvbQp8fGhxc2Jvbmxp +bmUud29yZHByZXNzLmNvbQp8fGludmVzdGlnYXRpbmcud29yZHByZXNzLmNvbQp8 +fGpvYm5ld2VyYS53b3JkcHJlc3MuY29tCnx8bWluZ2h1aXl3LndvcmRwcmVzcy5j +b20KfHx3bzN0dHQud29yZHByZXNzLmNvbQp8fHN1amlhdHVuLndvcmRwcmVzcy5j +b20KfHx4aWppZS53b3JkcHJlc3MuY29tCnx8d3AuY29tCgohLXx8d29ybXNjdWxw +dG9yLmNvbQoud293LmNvbQoud293LWxpZmUubmV0Cnx8d293bGVnYWN5Lm1sCnx8 +d293cG9ybi5jb20KfHx3b3dnaXJscy5jb20KLndvd3JrLmNvbQp3b3hpbmdodWln +dW8uY29tCi53b3lhb2xpYW4ub3JnCnxodHRwOi8vd295YW9saWFuLm9yZwoud3Bv +Zm9ydW0uY29tCnx8d3BvZm9ydW0uY29tCi53cXlkLm9yZwp8fHdxeWQub3JnCndy +Y2hpbmEub3JnCndyZXRjaC5jYwohLWNuLndzai5jb20vZ2IvMjAxMzAyMTUvdGVj +MTEzODUzLmFzcAoud3NqLmNvbQp8fHdzai5jb20KLndzai5uZXQKLndzamhrLmNv +bQoud3Ribi5vcmcKLnd0ZnBlb3BsZS5jb20Kd3VlcmthaXhpLmNvbQp8fHd1ZmFm +YW5nd2VuLmNvbQp3dWZpLm9yZy50dwp8fHd1Z3VvZ3VhbmcuY29tCnd1amllLm5l +dAp3dWppZWxpdWxhbi5jb20KfHx3dWppZWxpdWxhbi5jb20Kd3VrYW5ncnVpLm5l +dAp8fHd1dy5yZWQKfHx3dXlhbmJsb2cuY29tCi53d2l0di5jb20KfHx3d2l0di5j +b20Kd3p5Ym95LmltL3Bvc3QvMTYwCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1YWC0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLngtYmVycnkuY29tCnx8eC1iZXJyeS5j +b20KfHx4LWFydC5jb20KfHx4LXdhbGwub3JnCngxOTQ5eC5jb20KeDM2NXguY29t +CnhhbmdhLmNvbQp8fHhiYWJlLmNvbQoueGJvb2tjbi5jb20KfHx4Ym9va2NuLmNv +bQp8fHhjYWZlLmluCnx8eGNpdHkuanAKLnhjcml0aWMuY29tCnxodHRwOi8vY2Ru +Ki54ZGEtZGV2ZWxvcGVycy5jb20KLnhlcm90aWNhLmNvbQpkZXN0aW55LnhmaWxl +cy50by91YmJ0aHJlYWRzCi54Zm0ucHAucnUKLnhnbXlkLmNvbQp8fHhnbXlkLmNv +bQp4aGFtc3Rlci5jb20KfHx4aGFtc3Rlci5jb20KLnhpYW5jaGF3YW5nLm5ldAou +eGlhbmppYW4udHcKfGh0dHA6Ly94aWFuamlhbi50dwoueGlhbnFpYW8ubmV0Ci54 +aWFvYmFpd3UuY29tCi54aWFvY2h1bmNuanAuY29tCi54aWFvZC5pbgoueGlhb2hl +eGllLmNvbQp8fHhpYW9sYW4ubWUKfHx4aWFvbWEub3JnCnx8eGlhb2hleGllLmNv +bQp4aWV6aHVhLmNvbQoueGlodWEuZXMKZm9ydW0ueGluYmFvLmRlL2ZvcnVtCi54 +aW5nLmNvbQp8aHR0cDovL3hpbmcuY29tCi54aW5taWFvLmNvbS5oawp8fHhpbm1p +YW8uY29tLmhrCnhpbnNoZW5nLm5ldAp4aW5zaGlqdWUuY29tCnhpbmh1YW5ldC5v +cmcKfGh0dHA6Ly94aW55dWJicy5uZXQKLnhpb25ncGlhbi5jb20KLnhpdXJlbi5v +cmcKeGl6YW5nLXpoaXllLm9yZwp4anAuY2MKfHx4anAuY2MKfHx4anRyYXZlbGd1 +aWRlLmNvbQp4bGZtdGFsay5jb20KfHx4bGZtd3ouaW5mbwp8fHhtbC10cmFpbmlu +Zy1ndWlkZS5jb20KeG1vdmllcy5jb20KfHx4bnh4LmNvbQp4cGRvLm5ldAp8fHhw +dWQub3JnCi54cmVudGR2ZC5jb20KLnhza3l3YWxrZXIubmV0Cnx8eHR1YmUuY29t +CmJsb2cueHVpdGUubmV0CnZsb2cueHVpdGUubmV0Cnh1emhpeW9uZy5uZXQKfHx4 +dWNoYW8ub3JnCnh1Y2hhby5uZXQKfHx4dWNoYW8ubmV0Cnh2aWRlby5jYwoueHZp +ZGVvcy5jb20KfHx4dmlkZW9zLmNvbQp8fHh2aWRlb3MuZXMKLnhraXdpLnRrLwou +eHhiYnguY29tCi54eGxtb3ZpZXMuY29tCnx8eHh4LmNvbQoueHh4Lnh4eAp8aHR0 +cDovL3h4eC54eHgKLnh4eGZ1Y2ttb20uY29tCnx8eHh4eC5jb20uYXUKLnh4eHlt +b3ZpZXMuY29tCnxodHRwOi8veHh4eW1vdmllcy5jb20KeHlzLm9yZwp4eXNibG9n +cy5vcmcKeHl5NjkuY29tCnh5eTY5LmluZm8KCiEtLS0tLS0tLS0tLS0tLS0tLS0t +LVlZLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8fHlha2J1dHRlcmJsdWVzLmNv +bQp5YW0uY29tCnx8eWFtLmNvbQp8fHlhbS5vcmcudHcKLnlhbmdoZW5nanVuLmNv +bQp5YW5namlhbmxpLmNvbQoueWFzbmkuY28udWsKfHx5YXNuaS5jby51awohLS18 +fHlhc3VrdW5pLm9yLmpwCi55YXlhYmF5LmNvbS9mb3J1bQoueWR5LmNvbQoueWVh +aHRlZW50dWJlLmNvbQp8fHllYWh0ZWVudHViZS5jb20KfHx5ZWNsLm5ldAp8fHll +ZWxvdS5jb20KeWVleWkuY29tCnllZ2xlLm5ldAp8fHllZ2xlLm5ldAoueWVzLnh4 +eAp8fHllczEyMy5jb20udHcKfHx5ZXNhc2lhLmNvbQp8fHllc2FzaWEuY29tLmhr +Ci55ZXMtbmV3cy5jb20KfGh0dHA6Ly95ZXMtbmV3cy5jb20KLnllc3Bvcm5wbGVh +c2UuY29tCnx8eWVzcG9ybnBsZWFzZS5jb20KfGh0dHA6Ly95ZXllY2x1Yi5jb20K +IS0teWZyb2cuY29tCnx8eWhjdy5uZXQKLnlpYmFkYS5jb20KLnlpYmFvY2hpbmEu +Y29tCi55aWRpby5jb20KfHx5aWRpby5jb20KeWlsdWJicy5jb20KeGEueWltZy5j +b20KLnlpbmdzdW9zcy5jb20KLnlpcHViLmNvbQp8fHlpcHViLmNvbQp5aW5sZWku +b3JnL210Ci55aXpoaWhvbmd4aW5nLmNvbQoueW9idC5jb20KLnlvYnQudHYKfHx5 +b2J0LnR2Ci55b2dpY2hlbi5vcmcKfHx5b2dpY2hlbi5vcmcKeW9uZy5odQoueW9y +a2Jicy5jYQp8fHlvdXh1LmluZm8KLnlvdWppenouY29tCnx8eW91aml6ei5jb20K +eW91bWFrZXIuY29tCi55b3VuZ3Bvcm52aWRlb3MuY29tCnlvdW5nc3BpcmF0aW9u +LmhrCi55b3VwYWkub3JnCnx8eW91cGFpLm9yZwoueW91ci1mcmVlZG9tLm5ldAp8 +fHlvdXJlcGVhdC5jb20KLnlvdXJwcml2YXRldnBuLmNvbQp8fHlvdXJwcml2YXRl +dnBuLmNvbQoueW91c2VuZGl0LmNvbQp8fHlvdXNlbmRpdC5jb20KLnlvdXRobmV0 +cmFkaW8ub3JnL3RtaXQvZm9ydW0KYmxvZy55b3V0aHdhbnQuY29tLnR3Cm1lLnlv +dXRod2FudC5jb20udHcKc2hhcmUueW91dGh3YW50LmNvbS50dwp0b3BpYy55b3V0 +aHdhbnQuY29tLnR3Ci55b3Vwb3JuLmNvbQp8fHlvdXBvcm4uY29tCi55b3Vwb3Ju +Z2F5LmNvbQp8fHlvdXBvcm5nYXkuY29tCi55b3VybGlzdGVuLmNvbQp8aHR0cDov +L3lvdXJsaXN0ZW4uY29tCi55b3VybHVzdC5jb20KfGh0dHA6Ly95b3VybHVzdC5j +b20KeW91c2h1bjEyLmNvbQoueW91dHViZWNuLmNvbQp5b3V2ZXJzaW9uLmNvbQp8 +fHlvdXZlcnNpb24uY29tCmJsb2cueW91eHUuaW5mby8yMDEwLzAzLzE0L3dlc3Qt +Y2hhbWJlcgp5dGh0Lm5ldAp5dWFubWluZy5uZXQKLnl1YW56aGVuZ3Rhbmcub3Jn +Ci55dWxnaHVuLmNvbQp8fHl1bmNoYW8ubmV0Cnx8eXVudGlwdWIuY29tCi55dXZ1 +dHUuY29tCnx8eXZlc2dlbGV5bi5jb20KLnl3cHcuY29tL2ZvcnVtcy9oaXN0b3J5 +L3Bvc3QvQTAvcDAvaHRtbC8yMjcKeXg1MS5uZXQKLnl5aWkub3JnCnx8eXlpaS5v +cmcKLnl6emsuY29tCnxodHRwOi8veXp6ay5jb20KCiEtLS0tLS0tLS0tLS0tLS0t +LS0tLVpaLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp6YWNlYm9vay5jb20KLnph +bG1vcy5jb20KfHx6YWxtb3MuY29tCnx8emFubmVsLmNvbQohLS0uemFvYmFvLmNv +bQouemFvYmFvLmNvbS5zZwp8fHphb2Jhby5jb20uc2cKLnphb3pvbi5jb20KIS0t +LnpkbmV0LmNvbS50dy9uZXdzL3NvZnR3YXJlLzAsMjAwMDA4NTY3OCwyMDExMTE4 +NywwMAp8fHpkbmV0LmNvbS50dwouemVsbG8uY29tCnx8emVsbG8uY29tCi56ZW5n +amlueWFuLm9yZwouemVubWF0ZS5jb20KfHx6ZW5tYXRlLmNvbQp8fHplbm1hdGUu +Y29tLnJ1Cnx8emVyb25ldC5pbwp8fHpldXRjaC5jb20KIS0td3d3LnpmcmVldC5j +b20vcG9zdC91c2VqdW1wLWJyb3ducy5odG1sCi56ZnJlZXQuY29tCi56Z3NkZGgu +Y29tCnpnemNqai5uZXQKLnpoYW5iaW4ubmV0Cnx8emhhbmJpbi5uZXQKLnpoYW5n +Ym9saS5uZXQKfHx6aGFuZ3RpYW5saWFuZy5jb20KfHx6aGFubHZlLm9yZwp6aGVu +Z2h1aS5vcmcKLnpoZW5namlhbi5vcmcKfHx6aGVuZ2ppYW4ub3JnCnpoZW5nd3Vu +ZXQub3JnCnpoZW5saWJ1LmluZm8KfHx6aGVubGlidS5pbmZvCi56aGVubGlidTE5 +ODQuY29tCnx8emhlbmxpYnUxOTg0LmNvbQp8aHR0cDovL3poZW54aWFuZy5iaXoK +LnpoaW5lbmdsdXlvdS5jb20KemhvbmdndW8uY2EKfGh0dHA6Ly96aG9uZ2d1b3Jl +bnF1YW4ub3JnCnpob25nZ3VvdGVzZS5uZXQKfHx6aG9uZ2d1b3Rlc2UubmV0Cnx8 +emhvbmdtZW5nLm9yZwouemhvdXNodWd1YW5nLmNvbQp8fHpocmVhZGVyLmNvbQou +emh1YW5nYmkubWUKfHx6aHVhbmdiaS5tZQouemh1YW54aW5nLmNuCnx8emh1YXRp +ZWJhLmNvbQp6aHVpY2hhZ3Vvamkub3JnCnx8emh1aWNoYWd1b2ppLm9yZwp8aHR0 +cDovL2Jvb2suemk1Lm1lCi56aWRkdS5jb20vZG93bmxvYWQKfHx6aWxsaW9uay5j +b20KLnppbmlvLmNvbQp8fHppbmlvLmNvbQouemlwb3JuLmNvbQouemlwcHlzaGFy +ZS5jb20KLnprYWlwLmNvbQp8fHprYWlwLmNvbQpyZWFsZm9ydW0uemtpei5jb20K +IS0tfHx6bGliLm5ldAp8fHptdy5jbgouem9kZ2FtZS51cwp6b21vYm8ubmV0Ci56 +b25hZXVyb3BhLmNvbQp8fHpvbmFldXJvcGEuY29tCnx8em9uZ2hleGlud2VuLmNv +bQouem9uZ2hleGlud2VuLm5ldAp8fHpvb2d2cG4uY29tCnx8em9vdG9vbC5jb20K +Lnpvb3psZS5uZXQKd3JpdGVyLnpvaG8uY29tCnx8em9ycm92cG4uY29tCnx8enBu +LmltCnx8enNwZWVkZXIubWUKLnpzcmhhby5jb20KLnp1by5sYQp8fHp1by5sYQp8 +fHp1b2JpYW8ubWUKLnp1b2xhLmNvbQp8fHp1b2xhLmNvbQp8fHp2ZXJlZmYuY29t +Ci56eW5haW1hLmNvbQp6eXpjOS5jb20KLnp6Y2FydG9vbi5jb20KISMjIyMjIyMj +IyMjIyMjR2VuZXJhbCBMaXN0IEVuZCMjIyMjIyMjIyMjIyMjIyMjCgohIyMjIyMj +IyMjIyNTdXBwbGVtZW50YWwgTGlzdCBTdGFydCMjIyMjIyMjIyMjIyMKIS0tLS0t +LS0tLS0tLS0tLS0tVVJMIEtleXdvcmRzLS0tLS0tLS0tLS0tLS0tLS0tCjY0bWVt +bwphSFIwY0hNNkx5OTVaV05zTG01bGRBCmZyZWVuZXQKLmdvb2dsZS4qL2ZhbHVu +CnBob2Jvcy5hcHBsZS5jb20qL3ZpZGVvCnE9ZnJlZWRvbQpxJTNEZnJlZWRvbQpy +ZW1lbWJlcmluZ190aWFuYW5tZW5fMjBfeWVhcnMKc2VhcmNoKnNhZmV3ZWIKcT10 +cmlhbmdsZQpxJTNEVHJpYW5nbGUKdWx0cmFyZWFjaAp1bHRyYXN1cmYKISMjIyMj +IyMjIyMjIyNTdXBwbGVtZW50YWwgTGlzdCBFbmQjIyMjIyMjIyMjIyMjCgohIyMj +IyMjIyMjIyMjIyMjI1doaXRlbGlzdCBTdGFydCMjIyMjIyMjIyMjIyMjIyMKQEB8 +fGFsaXl1bi5jb20KQEB8fGJhaWR1LmNvbQohLS1AQHx8YmluZy5jb20KQEB8fGNo +aW5hc28uY29tCkBAfHxjaGluYXouY29tCkBAfGh0dHA6Ly9ucmNoLmN1bHR1cmUu +dHcvCiEtLUlTUCBjYWNoZSB3b3JrcyBzb21ldGltZXMsIHZlcmlmaWVkIGF0IGRy +cGVuZyArIGdlaHVhLgpAQHx8ZGwuZ29vZ2xlLmNvbQpAQHx8a2guZ29vZ2xlLmNv +bQpAQHx8a2htLmdvb2dsZS5jb20KQEB8fGtobTAuZ29vZ2xlLmNvbQpAQHx8a2ht +MS5nb29nbGUuY29tCkBAfHxraG0yLmdvb2dsZS5jb20KQEB8fGtobTMuZ29vZ2xl +LmNvbQpAQHx8a2htZGIuZ29vZ2xlLmNvbQpAQHx8dG9vbHMuZ29vZ2xlLmNvbQpA +QHx8Y2xpZW50c2VydmljZXMuZ29vZ2xlYXBpcy5jb20KQEB8fGZvbnRzLmdvb2ds +ZWFwaXMuY29tCkBAfHxraG0uZ29vZ2xlYXBpcy5jb20KQEB8fGtobTAuZ29vZ2xl +YXBpcy5jb20KQEB8fGtobTEuZ29vZ2xlYXBpcy5jb20KQEB8fGtobTIuZ29vZ2xl +YXBpcy5jb20KQEB8fGtobTMuZ29vZ2xlYXBpcy5jb20KQEB8fGtobWRiLmdvb2ds +ZWFwaXMuY29tCkBAfHxzdG9yYWdlLmdvb2dsZWFwaXMuY29tCkBAfHx0cmFuc2xh +dGUuZ29vZ2xlYXBpcy5jb20KQEB8fHVwZGF0ZS5nb29nbGVhcGlzLmNvbQpAQHx8 +c2FmZWJyb3dzaW5nLmdvb2dsZWFwaXMuY29tCkBAfHxjbi5ncmF2YXRhci5jb20K +QEB8fGNvbm5lY3Rpdml0eWNoZWNrLmdzdGF0aWMuY29tCkBAfHxjc2kuZ3N0YXRp +Yy5jb20KQEB8fGZvbnRzLmdzdGF0aWMuY29tCkBAfHxzc2wuZ3N0YXRpYy5jb20K +QEB8fGhhb3NvdS5jb20KQEB8fGlwLmNuCkBAfHxqaWtlLmNvbQpAQHxodHRwOi8v +dHJhbnNsYXRlLmdvb2dsZS5jbgpAQHxodHRwOi8vd3d3Lmdvb2dsZS5jbi9tYXBz +CkBAfHxodHRwMi5nb2xhbmcub3JnCkBAfHxnb3YuY24KQEB8fHFxLmNvbQpAQHx8 +c2luYS5jbgpAQHx8c2luYS5jb20uY24KQEB8fHNvZ291LmNvbQpAQHx8c28uY29t +CkBAfHxzb3NvLmNvbQpAQHx8dWx1YWkuY29tLmNuCkBAfHx3ZWliby5jb20KQEB8 +fHlhaG9vLmNuCkBAfHx5b3VkYW8uY29tCkBAfHx6aG9uZ3NvdS5jb20KQEB8aHR0 +cDovL2ltZS5iYWlkdS5qcAohIyMjIyMjIyMjIyMjIyMjI1doaXRlbGlzdCBFbmQj +IyMjIyMjIyMjIyMjIyMjIyMKIS0tLS0tLS0tLS0tLS0tLS0tLS0tLUVPRi0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tCg== diff --git a/ShadowsocksX-NG/install_kcptun.sh b/ShadowsocksX-NG/install_kcptun.sh deleted file mode 100755 index f30b4b4b..00000000 --- a/ShadowsocksX-NG/install_kcptun.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -# install_kcptun.sh -# ShadowsocksX-NG -# -# Created by 邱宇舟 on 2017/1/11. -# Copyright © 2017年 qiuyuzhou. All rights reserved. - -VERSION="20170322" - -cd `dirname "${BASH_SOURCE[0]}"` - -mkdir -p "$HOME/Library/Application Support/ShadowsocksX-NG/kcptun_$VERSION" -cp -f kcptun_client "$HOME/Library/Application Support/ShadowsocksX-NG/kcptun_$VERSION/" -rm -f "$HOME/Library/Application Support/ShadowsocksX-NG/kcptun_client" -ln -s "$HOME/Library/Application Support/ShadowsocksX-NG/kcptun_$VERSION/kcptun_client" "$HOME/Library/Application Support/ShadowsocksX-NG/kcptun_client" - -echo "install kcptun done" diff --git a/ShadowsocksX-NG/install_ss_local.sh b/ShadowsocksX-NG/install_ss_local.sh index 5d20d476..6bacccf9 100755 --- a/ShadowsocksX-NG/install_ss_local.sh +++ b/ShadowsocksX-NG/install_ss_local.sh @@ -10,7 +10,7 @@ cd `dirname "${BASH_SOURCE[0]}"` NGDir="$HOME/Library/Application Support/ShadowsocksX-NG" -TargetDir="$NGDir/ss-local-3.1.3" +TargetDir="$NGDir/ss-local-3.2.0" LatestTargetDir="$NGDir/ss-local-latest" echo ngdir: ${NGDir} @@ -23,20 +23,21 @@ ln -s "$TargetDir" "$LatestTargetDir" cp -f libev.4.dylib "$TargetDir" # 2.8.0 https://bintray.com/homebrew/bottles/mbedtls -cp -f libmbedcrypto.2.8.0.dylib "$TargetDir" -ln -s "$TargetDir/libmbedcrypto.2.8.0.dylib" "$TargetDir/libmbedcrypto.1.dylib" +cp -f libmbedcrypto.2.12.0.dylib "$TargetDir" +ln -sfh "$TargetDir/libmbedcrypto.2.12.0.dylib" "$TargetDir/libmbedcrypto.2.dylib" +ln -sfh "$TargetDir/libmbedcrypto.2.12.0.dylib" "$TargetDir/libmbedcrypto.3.dylib" # 8.42 https://bintray.com/homebrew/bottles/pcre cp -f libpcre.1.dylib "$TargetDir" # 1.0.16 https://bintray.com/homebrew/bottles/libsodium cp -f libsodium.23.dylib "$TargetDir" -ln -s "$TargetDir/libsodium.23.dylib" "$TargetDir/libsodium.dylib" +ln -sfh "$TargetDir/libsodium.23.dylib" "$TargetDir/libsodium.dylib" #cp -f libudns.0.dylib "$TargetDir" # 1.14.0 https://bintray.com/homebrew/bottles/c-ares cp -f libcares.2.dylib "$TargetDir" -ln -s "$TargetDir/libcares.2.dylib" "$TargetDir/libcares.dylib" +ln -sfh "$TargetDir/libcares.2.dylib" "$TargetDir/libcares.dylib" echo done diff --git a/ShadowsocksX-NG/kcptun_1.png b/ShadowsocksX-NG/kcptun_1.png deleted file mode 100644 index 30913a27..00000000 Binary files a/ShadowsocksX-NG/kcptun_1.png and /dev/null differ diff --git a/ShadowsocksX-NG/kcptun_client b/ShadowsocksX-NG/kcptun_client deleted file mode 100755 index 0ed88fc9..00000000 Binary files a/ShadowsocksX-NG/kcptun_client and /dev/null differ diff --git a/ShadowsocksX-NG/libmbedcrypto.2.12.0.dylib b/ShadowsocksX-NG/libmbedcrypto.2.12.0.dylib new file mode 100644 index 00000000..bfc970f6 Binary files /dev/null and b/ShadowsocksX-NG/libmbedcrypto.2.12.0.dylib differ diff --git a/ShadowsocksX-NG/libmbedcrypto.2.4.2.dylib b/ShadowsocksX-NG/libmbedcrypto.2.4.2.dylib deleted file mode 100644 index c68bff5c..00000000 Binary files a/ShadowsocksX-NG/libmbedcrypto.2.4.2.dylib and /dev/null differ diff --git a/ShadowsocksX-NG/libmbedcrypto.2.8.0.dylib b/ShadowsocksX-NG/libmbedcrypto.2.8.0.dylib deleted file mode 100644 index bbeca0c0..00000000 Binary files a/ShadowsocksX-NG/libmbedcrypto.2.8.0.dylib and /dev/null differ diff --git a/ShadowsocksX-NG/libudns.0.dylib b/ShadowsocksX-NG/libudns.0.dylib deleted file mode 100644 index 5a886307..00000000 Binary files a/ShadowsocksX-NG/libudns.0.dylib and /dev/null differ diff --git a/ShadowsocksX-NG/simple-obfs/install_simple_obfs.sh b/ShadowsocksX-NG/simple-obfs/install_simple_obfs.sh index 3c136290..45460616 100644 --- a/ShadowsocksX-NG/simple-obfs/install_simple_obfs.sh +++ b/ShadowsocksX-NG/simple-obfs/install_simple_obfs.sh @@ -1,10 +1,11 @@ #!/bin/sh +# v0.0.5 https://bintray.com/homebrew/bottles/simple-obfs FILE_DIR=`dirname "${BASH_SOURCE[0]}"` cd "$FILE_DIR" NGDir="$HOME/Library/Application Support/ShadowsocksX-NG" -TargetDir="$NGDir/simple-obfs-0.0.2" +TargetDir="$NGDir/simple-obfs-0.0.5" PluginDir="$NGDir/plugins" echo ngdir: ${NGDir} @@ -14,6 +15,6 @@ mkdir -p "$PluginDir" cp -f obfs-local "$TargetDir" -ln -sfh "$TargetDir/obfs-local" "$PluginDir" +ln -sfh "$TargetDir/obfs-local" "$PluginDir/simple-obfs" echo done diff --git a/ShadowsocksX-NG/simple-obfs/obfs-local b/ShadowsocksX-NG/simple-obfs/obfs-local index cce1a72a..e1976a3e 100755 Binary files a/ShadowsocksX-NG/simple-obfs/obfs-local and b/ShadowsocksX-NG/simple-obfs/obfs-local differ diff --git a/ShadowsocksX-NG/ss-local b/ShadowsocksX-NG/ss-local index f25d6c82..3e6980ab 100755 Binary files a/ShadowsocksX-NG/ss-local and b/ShadowsocksX-NG/ss-local differ diff --git a/ShadowsocksX-NG/start_kcptun.sh b/ShadowsocksX-NG/start_kcptun.sh deleted file mode 100755 index 1118f0b4..00000000 --- a/ShadowsocksX-NG/start_kcptun.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -# start_kcptun.sh -# ShadowsocksX-NG -# -# Created by 邱宇舟 on 2017/1/11. -# Copyright © 2017年 qiuyuzhou. All rights reserved. - -chmod 644 "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.kcptun.plist" -launchctl load -wF "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.kcptun.plist" -launchctl start com.qiuyuzhou.shadowsocksX-NG.kcptun diff --git a/ShadowsocksX-NG/stop_kcptun.sh b/ShadowsocksX-NG/stop_kcptun.sh deleted file mode 100755 index 68536fc9..00000000 --- a/ShadowsocksX-NG/stop_kcptun.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -# stop_kcptun.sh -# ShadowsocksX-NG -# -# Created by 邱宇舟 on 2017/1/11. -# Copyright © 2017年 qiuyuzhou. All rights reserved. - -launchctl stop com.qiuyuzhou.shadowsocksX-NG.kcptun -launchctl unload "$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.kcptun.plist" diff --git a/ShadowsocksX-NG/zh-Hans.lproj/Localizable.strings b/ShadowsocksX-NG/zh-Hans.lproj/Localizable.strings index 3dc0bbee..4a8f7840 100755 --- a/ShadowsocksX-NG/zh-Hans.lproj/Localizable.strings +++ b/ShadowsocksX-NG/zh-Hans.lproj/Localizable.strings @@ -26,7 +26,9 @@ * ./AppDelegate.swift */ -"Add Shadowsocks Server Profile" = "已添加新Shadowsocks服务器配置"; +"Add \(addCount) Shadowsocks Server Profile" = "已添加\(addCount)个Shadowsocks服务器配置"; + +"Not found valid qrcode or url of shadowsocks profile" = "没有找到有效的shadowsocks配置二维码或链接"; "By scan QR Code" = "通过扫描二维码"; diff --git a/ShadowsocksX-NG/zh-Hans.lproj/MainMenu.strings b/ShadowsocksX-NG/zh-Hans.lproj/MainMenu.strings index 8662d88d..b9833604 100644 --- a/ShadowsocksX-NG/zh-Hans.lproj/MainMenu.strings +++ b/ShadowsocksX-NG/zh-Hans.lproj/MainMenu.strings @@ -2,6 +2,9 @@ /* Class = "NSMenuItem"; title = "Preferences..."; ObjectID = "4CS-qD-zW5"; */ "4CS-qD-zW5.title" = "偏好设置..."; +/* Class = "NSMenuItem"; title = "Import Server URLs From Pasteboard"; ObjectID = "7Eq-XD-K5c"; */ +"7Eq-XD-K5c.title" = "从剪贴板导入服务器配置链接"; + /* Class = "NSMenuItem"; title = "应用用户自定规则到 PAC"; ObjectID = "6qf-cg-HXc"; */ "6qf-cg-HXc.title" = "应用用户自定规则到 PAC"; @@ -30,7 +33,7 @@ "Mw3-Jm-eXA.title" = "全局模式"; /* Class = "NSMenuItem"; title = "扫描屏幕上的二维码..."; ObjectID = "Qe6-bF-paT"; */ -"Qe6-bF-paT.title" = "扫描屏幕上的二维码..."; +"Qe6-bF-paT.title" = "扫描屏幕上的二维码"; /* Class = "NSMenuItem"; title = "显示当前服务器的二维码..."; ObjectID = "R6A-96-Zcb"; */ "R6A-96-Zcb.title" = "显示当前服务器的二维码..."; @@ -98,4 +101,12 @@ /* Class = "NSMenuItem"; title = "Preferences"; ObjectID = "iVn-LD-Ynd"; */ "iVn-LD-Ynd.title" = "偏好设置"; +/* Class = "NSMenuItem"; title = "Share Server Profiles..."; ObjectID = "r5z-RB-LIZ"; */ +"r5z-RB-LIZ.title" = "分享服务器配置..."; + +/* Class = "NSMenuItem"; title = "Help"; ObjectID = "Xg8-er-4Ov"; */ +"Xg8-er-4Ov.title" = "帮助"; + +/* Class = "NSMenuItem"; title = "Check for Updates..."; ObjectID = "hLv-bp-doM"; */ +"hLv-bp-doM.title" = "检查更新..."; diff --git a/ShadowsocksX-NG/zh-Hans.lproj/ShareServerProfilesWindowController.strings b/ShadowsocksX-NG/zh-Hans.lproj/ShareServerProfilesWindowController.strings new file mode 100644 index 00000000..8def4b00 --- /dev/null +++ b/ShadowsocksX-NG/zh-Hans.lproj/ShareServerProfilesWindowController.strings @@ -0,0 +1,19 @@ + +/* Class = "NSButtonCell"; title = "Save All Server URLs As File"; ObjectID = "9OS-xy-GB1"; */ +"9OS-xy-GB1.title" = "保存所有服务器链接到文件"; + +/* Class = "NSWindow"; title = "Share Server Profiles"; ObjectID = "F0z-JX-Cv5"; */ +"F0z-JX-Cv5.title" = "分享服务器配置"; + +/* Class = "NSButtonCell"; title = "Save QRCode As File"; ObjectID = "IaI-Rj-Kss"; */ +"IaI-Rj-Kss.title" = "保存二维码到文件"; + +/* Class = "NSButtonCell"; title = "Copy URL"; ObjectID = "PHX-gY-lZe"; */ +"PHX-gY-lZe.title" = "复制链接"; + +/* Class = "NSButtonCell"; title = "Copy QRCode"; ObjectID = "PrW-s6-Uab"; */ +"PrW-s6-Uab.title" = "复制二维码"; + +/* Class = "NSButtonCell"; title = "Copy All Server URLs"; ObjectID = "Yt2-p1-4w0"; */ +"Yt2-p1-4w0.title" = "复制所有服务器链接"; +