@cybrid/cybrid-api-id-angular 0.129.751 → 0.129.752
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/esm2020/api/bankApplications.service.mjs +2 -2
- package/esm2020/api/customerTokens.service.mjs +2 -2
- package/esm2020/api/organizationApplications.service.mjs +2 -2
- package/esm2020/api/users.service.mjs +2 -2
- package/esm2020/model/application.mjs +2 -2
- package/esm2020/model/applicationList.mjs +1 -1
- package/esm2020/model/applicationWithSecret.mjs +1 -1
- package/esm2020/model/applicationWithSecretAllOf.mjs +2 -2
- package/esm2020/model/customerToken.mjs +2 -2
- package/esm2020/model/errorResponse.mjs +2 -2
- package/esm2020/model/patchApplication.mjs +2 -2
- package/esm2020/model/patchUser.mjs +2 -2
- package/esm2020/model/postBankApplication.mjs +2 -2
- package/esm2020/model/postCustomerToken.mjs +2 -2
- package/esm2020/model/postOrganizationApplication.mjs +2 -2
- package/esm2020/model/postUser.mjs +2 -2
- package/esm2020/model/user.mjs +2 -2
- package/esm2020/model/userList.mjs +1 -1
- package/fesm2015/cybrid-cybrid-api-id-angular.mjs +9 -9
- package/fesm2015/cybrid-cybrid-api-id-angular.mjs.map +1 -1
- package/fesm2020/cybrid-cybrid-api-id-angular.mjs +15 -15
- package/fesm2020/cybrid-cybrid-api-id-angular.mjs.map +1 -1
- package/model/application.d.ts +1 -1
- package/model/applicationList.d.ts +1 -1
- package/model/applicationWithSecretAllOf.d.ts +1 -1
- package/model/customerToken.d.ts +1 -1
- package/model/errorResponse.d.ts +1 -1
- package/model/patchApplication.d.ts +1 -1
- package/model/patchUser.d.ts +1 -1
- package/model/postBankApplication.d.ts +1 -1
- package/model/postCustomerToken.d.ts +1 -1
- package/model/postOrganizationApplication.d.ts +1 -1
- package/model/postUser.d.ts +1 -1
- package/model/user.d.ts +1 -1
- package/model/userList.d.ts +1 -1
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Cybrid Identity API
|
|
3
3
|
* # Cybrid API documentation Welcome to Cybrid, an all-in-one crypto platform that enables you to easily **build** and **launch** white-label crypto products or services. In these documents, you\'ll find details on how our REST API operates and generally how our platform functions. If you\'re looking for our UI SDK Widgets for Web or Mobile (iOS/Android), generated API clients, or demo applications, head over to our [Github repo](https://github.com/Cybrid-app). 💡 We recommend bookmarking the [Cybrid LinkTree](https://linktr.ee/cybridtechnologies) which contains many helpful links to platform resources. ## Getting Started This is Cybrid\'s public interactive API documentation, which allows you to fully test our APIs. If you\'d like to use a different tool to exercise our APIs, you can download the [Open API 3.0 yaml](https://bank.production.cybrid.app/api/schema/v1/swagger.yaml) for import. If you\'re new to our APIs and the Cybrid Platform, follow the below guides to get set up and familiar with the platform: 1. [Introduction](https://docs.cybrid.xyz/docs/introduction) 2. [Platform Overview](https://docs.cybrid.xyz/docs/platform-overview) 3. [Testing with Hosted Web Demo App](https://docs.cybrid.xyz/docs/hosted-demo-app) In [Getting Started in the Cybrid Sandbox](https://docs.cybrid.xyz/docs/cybrid-sandbox), we walk you through how to use the [Cybrid Sandbox](https://id.sandbox.cybrid.app/) to create a test bank and generate API keys. In [Getting Ready for Trading](https://docs.cybrid.xyz/docs/trade-process), we walk through creating customers, customer identities, accounts, as well as executing quotes and trades. ## Working with the Cybrid Platform There are three primary ways you can interact with the Cybrid platform: 1. Directly via our RESTful API (this documentation) 2. Using our API clients available in a variety of languages ([Angular](https://github.com/Cybrid-app/cybrid-api-bank-angular), [Java](https://github.com/Cybrid-app/cybrid-api-bank-java), [Kotlin](https://github.com/Cybrid-app/cybrid-api-bank-kotlin), [Python](https://github.com/Cybrid-app/cybrid-api-bank-python), [Ruby](https://github.com/Cybrid-app/cybrid-api-bank-ruby), [Swift](https://github.com/Cybrid-app/cybrid-api-bank-swift) or [Typescript](https://github.com/Cybrid-app/cybrid-api-bank-typescript)) 3. Integrating a platform specific SDK ([Web](https://github.com/Cybrid-app/cybrid-sdk-web), [Android](https://github.com/Cybrid-app/cybrid-sdk-android), [iOS](https://github.com/Cybrid-app/cybrid-sdk-ios)) Our complete set of APIs allows you to manage resources across three distinct areas: your `Organization`, your `Banks` and your `Identities`. For most of your testing and interaction you\'ll be using the `Bank` API, which is where the majority of APIs reside. *The complete set of APIs can be found on the following pages:* | API | Description | |------------------------------------------------------------------|-------------------------------------------------------------| | [Organization API](https://organization.production.cybrid.app/api/schema/swagger-ui) | APIs to manage organizations | | [Bank API](https://bank.production.cybrid.app/api/schema/swagger-ui) | APIs to manage banks (and all downstream customer activity) | | [Identities API](https://id.production.cybrid.app/api/schema/swagger-ui) | APIs to manage organization and bank identities | For questions please contact [Support](mailto:support@cybrid.xyz) at any time for assistance, or contact the [Product Team](mailto:product@cybrid.xyz) for product suggestions. ## Authenticating with the API The Cybrid Platform uses OAuth 2.0 Bearer Tokens to authenticate requests to the platform. Credentials to create `Organization` and `Bank` tokens can be generated via the [Cybrid Sandbox](https://id.production.cybrid.app). Access tokens can be generated for a `Customer` as well via the [Cybrid IdP](https://id.production.cybrid.app) as well. An `Organization` access token applies broadly to the whole Organization and all of its `Banks`, whereas, a `Bank` access token is specific to an individual Bank. `Customer` tokens, similarly, are scoped to a specific customer in a bank. Both `Organization` and `Bank` tokens can be created using the OAuth Client Credential Grant flow. Each Organization and Bank has its own unique `Client ID` and `Secret` that allows for machine-to-machine authentication. A `Bank` can then generate `Customer` access tokens via API using our [Identities API](https://id.production.cybrid.app/api/schema/swagger-ui). <font color=\"orange\">**⚠️ Never share your Client ID or Secret publicly or in your source code repository.**</font> Your `Client ID` and `Secret` can be exchanged for a time-limited `Bearer Token` by interacting with the Cybrid Identity Provider or through interacting with the **Authorize** button in this document. The following curl command can be used to quickly generate a `Bearer Token` for use in testing the API or demo applications. ``` # Example request when using Bank credentials curl -X POST https://id.production.cybrid.app/oauth/token -d \'{ \"grant_type\": \"client_credentials\", \"client_id\": \"<Your Client ID>\", \"client_secret\": \"<Your Secret>\", \"scope\": \"banks:read banks:write bank_applications:read bank_applications:write bank_applications:execute accounts:read accounts:write accounts:execute counterparties:read counterparties:pii:read counterparties:write counterparties:execute customers:read customers:pii:read customers:write customers:execute prices:read quotes:execute quotes:read trades:execute trades:read transfers:execute transfers:read transfers:write external_bank_accounts:read external_bank_accounts:pii:read external_bank_accounts:write external_bank_accounts:execute external_wallets:read external_wallets:write external_wallets:execute workflows:read workflows:execute deposit_addresses:read deposit_addresses:write deposit_addresses:execute deposit_bank_accounts:read deposit_bank_accounts:write deposit_bank_accounts:execute invoices:read invoices:write invoices:execute identity_verifications:read identity_verifications:pii:read identity_verifications:write identity_verifications:execute persona_sessions:execute sardine_sessions:execute plans:execute plans:read executions:execute executions:read files:read files:pii:read files:execute\" }\' -H \"Content-Type: application/json\" # When using Organization credentials set `scope` to \'organizations:read organizations:write organization_applications:read organization_applications:write organization_applications:execute banks:read banks:write banks:execute bank_applications:read bank_applications:write bank_applications:execute users:read users:write users:execute counterparties:read counterparties:pii:read customers:read customers:pii:read accounts:read accounts:write prices:read quotes:execute quotes:read trades:execute trades:read transfers:read transfers:write transfers:execute external_bank_accounts:read external_bank_accounts:pii:read external_bank_accounts:write external_wallets:read external_wallets:write workflows:read deposit_addresses:read deposit_addresses:write deposit_bank_accounts:read deposit_bank_accounts:write deposit_bank_accounts:execute invoices:read subscriptions:read subscriptions:write subscriptions:execute subscription_events:read subscription_events:execute identity_verifications:read identity_verifications:pii:read identity_verifications:execute persona_sessions:execute sardine_sessions:execute plans:execute plans:read executions:execute executions:read files:read files:pii:read files:execute\' ``` <font color=\"orange\">**⚠️ Note: The above curl will create a bearer token with full scope access. Delete scopes if you\'d like to restrict access.**</font> ## Authentication Scopes The Cybrid platform supports the use of scopes to control the level of access a token is limited to. Scopes do not grant access to resources; instead, they provide limits, in support of the least privilege principal. The following scopes are available on the platform and can be requested when generating either an Organization, Bank or Customer token. Generally speaking, the _Read_ scope is required to read and list resources, the _Write_ scope is required to update a resource and the _Execute_ scope is required to create a resource. | Resource | Read scope (Token Type) | Write scope (Token Type) | Execute scope (Token Type) | |-----------------------|------------------------------------------------------------|-----------------------------------------------|--------------------------------------------------| | Account | accounts:read (Organization, Bank, Customer) | | accounts:execute (Bank, Customer) | | Bank | banks:read (Organization, Bank) | banks:write (Organization, Bank) | banks:execute (Organization) | | Customer | customers:read (Organization, Bank, Customer) | customers:write (Bank, Customer) | customers:execute (Bank) | | Counterparty | counterparties:read (Organization, Bank, Customer) | counterparties:write (Bank, Customer) | counterparties:execute (Bank) | | Deposit Address | deposit_addresses:read (Organization, Bank, Customer) | deposit_addresses:write (Bank, Customer) | deposit_addresses:execute (Bank, Customer) | | External Bank Account | external_bank_accounts:read (Organization, Bank, Customer) | external_bank_accounts:write (Bank, Customer) | external_bank_accounts:execute (Bank, Customer) | | External Wallet | external_wallet:read (Organization, Bank, Customer) | | external_wallet:execute (Bank, Customer) | | Organization | organizations:read (Organization) | organizations:write (Organization) | | | User | users:read (Organization) | | users:execute (Organization) | | Price | prices:read (Bank, Customer) | | | | Quote | quotes:read (Organization, Bank, Customer) | | quotes:execute (Organization, Bank, Customer) | | Trade | trades:read (Organization, Bank, Customer) | | trades:execute (Organization, Bank, Customer) | | Transfer | transfers:read (Organization, Bank, Customer) | | transfers:execute (Organization, Bank, Customer) | | Workflow | workflows:read (Organization, Bank, Customer) | | workflows:execute (Bank, Customer) | | Invoice | invoices:read (Organization, Bank, Customer) | invoices:write (Bank, Customer) | invoices:execute (Bank, Customer) | ## Available Endpoints The available APIs for the [Identity](https://id.production.cybrid.app/api/schema/swagger-ui), [Organization](https://organization.production.cybrid.app/api/schema/swagger-ui) and [Bank](https://bank.production.cybrid.app/api/schema/swagger-ui) API services are listed below: | API Service | Model | API Endpoint Path | Description | |--------------|----------------------|--------------------------------|---------------------------------------------------------------------------------------------------| | Identity | Bank | /api/bank_applications | Create and list banks | | Identity | CustomerToken | /api/customer_tokens | Create customer JWT access tokens | | Identity | Organization | /api/organization_applications | Create and list organizations | | Identity | Organization | /api/users | Create and list organization users | | Organization | Organization | /api/organizations | APIs to retrieve and update organization name | | Bank | Account | /api/accounts | Create and list accounts, which hold a specific asset for a customers | | Bank | Asset | /api/assets | Get a list of assets supported by the platform (ex: BTC, ETH) | | Bank | Bank | /api/banks | Create, update and list banks, the parent to customers, accounts, etc | | Bank | Customer | /api/customers | Create and list customers | | Bank | Counterparty | /api/counterparties | Create and list counterparties | | Bank | DepositAddress | /api/deposit_addresses | Create, get and list deposit addresses | | Bank | ExternalBankAccount | /api/external_bank_accounts | Create, get and list external bank accounts, which connect customer bank accounts to the platform | | Bank | ExternalWallet | /api/external_wallets | Create, get, list and delete external wallets, which connect customer wallets to the platform | | Bank | IdentityVerification | /api/identity_verifications | Create and list identity verifications, which are performed on customers for KYC | | Bank | Invoice | /api/invoices | Create, get, cancel and list invoices | | Bank | PaymentInstruction | /api/payment_instructions | Create, get and list payment instructions for invoices | | Bank | Price | /api/prices | Get the current prices for assets on the platform | | Bank | Quote | /api/quotes | Create and list quotes, which are required to execute trades | | Bank | Symbol | /api/symbols | Get a list of symbols supported for trade (ex: BTC-USD) | | Bank | Trade | /api/trades | Create and list trades, which buy or sell cryptocurrency | | Bank | Transfer | /api/transfers | Create, get and list transfers (e.g., funding, book) | | Bank | Workflow | /api/workflows | Create, get and list workflows | ## Understanding Object Models & Endpoints **Organizations** An `Organization` is meant to represent the organization partnering with Cybrid to use our platform. An `Organization` typically does not directly interact with `customers`. Instead, an Organization has one or more `banks`, which encompass the financial service offerings of the platform. **Banks** A `Bank` is owned by an `Organization` and can be thought of as an environment or container for `customers` and product offerings. Banks are created in either `Sandbox` or `Production` mode, where `Sandbox` is the environment that you would test, prototype and build in prior to moving to `Production`. An `Organization` can have multiple `banks`, in either `Sandbox` or `Production` environments. A `Sandbox Bank` will be backed by stubbed data and process flows. For instance, funding source transfer processes as well as trades will be simulated rather than performed, however asset prices are representative of real-world values. You have an unlimited amount of simulated fiat currency for testing purposes. **Customers** `Customers` represent your banking users on the platform. At present, we offer support for `Individuals` as Customers. `Customers` must be verified (i.e., KYC\'d) in our system before they can play any part on the platform, which means they must have an associated and a passing `Identity Verification`. See the Identity Verifications section for more details on how a customer can be verified. `Customers` must also have an `Account` to be able to transact, in the desired asset class. See the Accounts APIs for more details on setting up accounts for the customer.
|
|
4
4
|
*
|
|
5
|
-
* The version of the OpenAPI document: v0.129.
|
|
5
|
+
* The version of the OpenAPI document: v0.129.752
|
|
6
6
|
* Contact: support@cybrid.app
|
|
7
7
|
*
|
|
8
8
|
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
@@ -149,4 +149,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
149
149
|
}] }, { type: i2.Configuration, decorators: [{
|
|
150
150
|
type: Optional
|
|
151
151
|
}] }]; } });
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tZXJUb2tlbnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FwaS9jdXN0b21lclRva2Vucy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUNzQixXQUFXLEVBQ3hELE1BQVksc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQStCLFlBQVksQ0FBQztBQVUvRSxhQUFhO0FBQ2IsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBMEIsY0FBYyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBMEMsa0JBQWtCLENBQUM7Ozs7QUFPckYsTUFBTSxPQUFPLHFCQUFxQjtJQU85QixZQUFzQixVQUFzQixFQUFnQyxRQUFnQixFQUFjLGFBQTRCO1FBQWhILGVBQVUsR0FBVixVQUFVLENBQVk7UUFMbEMsYUFBUSxHQUFHLCtCQUErQixDQUFDO1FBQzlDLG1CQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxrQkFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFJdkMsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztTQUN0QztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDakQsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7Z0JBQzlCLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQzFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJ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YSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtpQkFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGdDQUFnQyxDQUFDLEVBQUU7Z0JBQ3hFLGFBQWEsR0FBRyxNQUFNLENBQUM7YUFDMUI7aUJBQU07Z0JBQ0gsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBd0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsc0JBQXNCLEVBQ25HLHlCQUF5QixFQUN6QjtZQUNJLE9BQU8sRUFBRSxtQkFBbUI7WUFDNUIsWUFBWSxFQUFPLGFBQWE7WUFDaEMsZUFBZSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZTtZQUNuRCxPQUFPLEVBQUUsZUFBZTtZQUN4QixPQUFPLEVBQUUsT0FBTztZQUNoQixjQUFjLEVBQUUsY0FBYztTQUNqQyxDQUNKLENBQUM7SUFDTixDQUFDOzttSEF2SVEscUJBQXFCLDRDQU9tQyxTQUFTO3VIQVBqRSxxQkFBcUIsY0FGcEIsTUFBTTs0RkFFUCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFRa0QsUUFBUTs7MEJBQUcsTUFBTTsyQkFBQyxTQUFTOzswQkFBcUIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3licmlkIElkZW50aXR5IEFQSVxuICogIyBDeWJyaWQgQVBJIGRvY3VtZW50YXRpb24gIFdlbGNvbWUgdG8gQ3licmlkLCBhbiBhbGwtaW4tb25lIGNyeXB0byBwbGF0Zm9ybSB0aGF0IGVuYWJsZXMgeW91IHRvIGVhc2lseSAqKmJ1aWxkKiogYW5kICoqbGF1bmNoKiogd2hpdGUtbGFiZWwgY3J5cHRvIHByb2R1Y3RzIG9yIHNlcnZpY2VzLiAgSW4gdGhlc2UgZG9jdW1lbnRzLCB5b3VcXCdsbCBmaW5kIGRldGFpbHMgb24gaG93IG91ciBSRVNUIEFQSSBvcGVyYXRlcyBhbmQgZ2VuZXJhbGx5IGhvdyBvdXIgcGxhdGZvcm0gZnVuY3Rpb25zLiAgSWYgeW91XFwncmUgbG9va2luZyBmb3Igb3VyIFVJIFNESyBXaWRnZXRzIGZvciBXZWIgb3IgTW9iaWxlIChpT1MvQW5kcm9pZCksIGdlbmVyYXRlZCBBUEkgY2xpZW50cywgb3IgZGVtbyBhcHBsaWNhdGlvbnMsIGhlYWQgb3ZlciB0byBvdXIgW0dpdGh1YiByZXBvXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcCkuICDwn5KhIFdlIHJlY29tbWVuZCBib29rbWFya2luZyB0aGUgW0N5YnJpZCBMaW5rVHJlZV0oaHR0cHM6Ly9saW5rdHIuZWUvY3licmlkdGVjaG5vbG9naWVzKSB3aGljaCBjb250YWlucyBtYW55IGhlbHBmdWwgbGlua3MgdG8gcGxhdGZvcm0gcmVzb3VyY2VzLiAgIyMgR2V0dGluZyBTdGFydGVkICBUaGlzIGlzIEN5YnJpZFxcJ3MgcHVibGljIGludGVyYWN0aXZlIEFQSSBkb2N1bWVudGF0aW9uLCB3aGljaCBhbGxvd3MgeW91IHRvIGZ1bGx5IHRlc3Qgb3VyIEFQSXMuIElmIHlvdVxcJ2QgbGlrZSB0byB1c2UgYSBkaWZmZXJlbnQgdG9vbCB0byBleGVyY2lzZSBvdXIgQVBJcywgeW91IGNhbiBkb3dubG9hZCB0aGUgW09wZW4gQVBJIDMuMCB5YW1sXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvdjEvc3dhZ2dlci55YW1sKSBmb3IgaW1wb3J0LiAgSWYgeW91XFwncmUgbmV3IHRvIG91ciBBUElzIGFuZCB0aGUgQ3licmlkIFBsYXRmb3JtLCBmb2xsb3cgdGhlIGJlbG93IGd1aWRlcyB0byBnZXQgc2V0IHVwIGFuZCBmYW1pbGlhciB3aXRoIHRoZSBwbGF0Zm9ybTogIDEuIFtJbnRyb2R1Y3Rpb25dKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaW50cm9kdWN0aW9uKSAyLiBbUGxhdGZvcm0gT3ZlcnZpZXddKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvcGxhdGZvcm0tb3ZlcnZpZXcpIDMuIFtUZXN0aW5nIHdpdGggSG9zdGVkIFdlYiBEZW1vIEFwcF0oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy9ob3N0ZWQtZGVtby1hcHApICBJbiBbR2V0dGluZyBTdGFydGVkIGluIHRoZSBDeWJyaWQgU2FuZGJveF0oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy9jeWJyaWQtc2FuZGJveCksIHdlIHdhbGsgeW91IHRocm91Z2ggaG93IHRvIHVzZSB0aGUgW0N5YnJpZCBTYW5kYm94XShodHRwczovL2lkLnNhbmRib3guY3licmlkLmFwcC8pIHRvIGNyZWF0ZSBhIHRlc3QgYmFuayBhbmQgZ2VuZXJhdGUgQVBJIGtleXMuIEluIFtHZXR0aW5nIFJlYWR5IGZvciBUcmFkaW5nXShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL3RyYWRlLXByb2Nlc3MpLCB3ZSB3YWxrIHRocm91Z2ggY3JlYXRpbmcgY3VzdG9tZXJzLCBjdXN0b21lciBpZGVudGl0aWVzLCBhY2NvdW50cywgYXMgd2VsbCBhcyBleGVjdXRpbmcgcXVvdGVzIGFuZCB0cmFkZXMuICAjIyBXb3JraW5nIHdpdGggdGhlIEN5YnJpZCBQbGF0Zm9ybSAgVGhlcmUgYXJlIHRocmVlIHByaW1hcnkgd2F5cyB5b3UgY2FuIGludGVyYWN0IHdpdGggdGhlIEN5YnJpZCBwbGF0Zm9ybTogIDEuIERpcmVjdGx5IHZpYSBvdXIgUkVTVGZ1bCBBUEkgKHRoaXMgZG9jdW1lbnRhdGlvbikgMi4gVXNpbmcgb3VyIEFQSSBjbGllbnRzIGF2YWlsYWJsZSBpbiBhIHZhcmlldHkgb2YgbGFuZ3VhZ2VzIChbQW5ndWxhcl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWFuZ3VsYXIpLCBbSmF2YV0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWphdmEpLCBbS290bGluXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmsta290bGluKSwgW1B5dGhvbl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXB5dGhvbiksIFtSdWJ5XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstcnVieSksIFtTd2lmdF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXN3aWZ0KSBvciBbVHlwZXNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXR5cGVzY3JpcHQpKSAzLiBJbnRlZ3JhdGluZyBhIHBsYXRmb3JtIHNwZWNpZmljIFNESyAoW1dlYl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay13ZWIpLCBbQW5kcm9pZF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay1hbmRyb2lkKSwgW2lPU10oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay1pb3MpKSAgT3VyIGNvbXBsZXRlIHNldCBvZiBBUElzIGFsbG93cyB5b3UgdG8gbWFuYWdlIHJlc291cmNlcyBhY3Jvc3MgdGhyZWUgZGlzdGluY3QgYXJlYXM6IHlvdXIgYE9yZ2FuaXphdGlvbmAsIHlvdXIgYEJhbmtzYCBhbmQgeW91ciBgSWRlbnRpdGllc2AuIEZvciBtb3N0IG9mIHlvdXIgdGVzdGluZyBhbmQgaW50ZXJhY3Rpb24geW91XFwnbGwgYmUgdXNpbmcgdGhlIGBCYW5rYCBBUEksIHdoaWNoIGlzIHdoZXJlIHRoZSBtYWpvcml0eSBvZiBBUElzIHJlc2lkZS4gICpUaGUgY29tcGxldGUgc2V0IG9mIEFQSXMgY2FuIGJlIGZvdW5kIG9uIHRoZSBmb2xsb3dpbmcgcGFnZXM6KiAgfCBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgW09yZ2FuaXphdGlvbiBBUEldKGh0dHBzOi8vb3JnYW5pemF0aW9uLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgfCBBUElzIHRvIG1hbmFnZSBvcmdhbml6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgW0JhbmsgQVBJXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICAgICAgICAgICAgICAgICAgfCBBUElzIHRvIG1hbmFnZSBiYW5rcyAoYW5kIGFsbCBkb3duc3RyZWFtIGN1c3RvbWVyIGFjdGl2aXR5KSB8IHwgW0lkZW50aXRpZXMgQVBJXShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgICAgICAgICAgICAgICAgICAgICB8IEFQSXMgdG8gbWFuYWdlIG9yZ2FuaXphdGlvbiBhbmQgYmFuayBpZGVudGl0aWVzICAgICAgICAgICAgIHwgIEZvciBxdWVzdGlvbnMgcGxlYXNlIGNvbnRhY3QgW1N1cHBvcnRdKG1haWx0bzpzdXBwb3J0QGN5YnJpZC54eXopIGF0IGFueSB0aW1lIGZvciBhc3Npc3RhbmNlLCBvciBjb250YWN0IHRoZSBbUHJvZHVjdCBUZWFtXShtYWlsdG86cHJvZHVjdEBjeWJyaWQueHl6KSBmb3IgcHJvZHVjdCBzdWdnZXN0aW9ucy4gICMjIEF1dGhlbnRpY2F0aW5nIHdpdGggdGhlIEFQSSAgVGhlIEN5YnJpZCBQbGF0Zm9ybSB1c2VzIE9BdXRoIDIuMCBCZWFyZXIgVG9rZW5zIHRvIGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyB0byB0aGUgcGxhdGZvcm0uIENyZWRlbnRpYWxzIHRvIGNyZWF0ZSBgT3JnYW5pemF0aW9uYCBhbmQgYEJhbmtgIHRva2VucyBjYW4gYmUgZ2VuZXJhdGVkIHZpYSB0aGUgW0N5YnJpZCBTYW5kYm94XShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcCkuIEFjY2VzcyB0b2tlbnMgY2FuIGJlIGdlbmVyYXRlZCBmb3IgYSBgQ3VzdG9tZXJgIGFzIHdlbGwgdmlhIHRoZSBbQ3licmlkIElkUF0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHApIGFzIHdlbGwuICBBbiBgT3JnYW5pemF0aW9uYCBhY2Nlc3MgdG9rZW4gYXBwbGllcyBicm9hZGx5IHRvIHRoZSB3aG9sZSBPcmdhbml6YXRpb24gYW5kIGFsbCBvZiBpdHMgYEJhbmtzYCwgd2hlcmVhcywgYSBgQmFua2AgYWNjZXNzIHRva2VuIGlzIHNwZWNpZmljIHRvIGFuIGluZGl2aWR1YWwgQmFuay4gYEN1c3RvbWVyYCB0b2tlbnMsIHNpbWlsYXJseSwgYXJlIHNjb3BlZCB0byBhIHNwZWNpZmljIGN1c3RvbWVyIGluIGEgYmFuay4gIEJvdGggYE9yZ2FuaXphdGlvbmAgYW5kIGBCYW5rYCB0b2tlbnMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIE9BdXRoIENsaWVudCBDcmVkZW50aWFsIEdyYW50IGZsb3cuIEVhY2ggT3JnYW5pemF0aW9uIGFuZCBCYW5rIGhhcyBpdHMgb3duIHVuaXF1ZSBgQ2xpZW50IElEYCBhbmQgYFNlY3JldGAgdGhhdCBhbGxvd3MgZm9yIG1hY2hpbmUtdG8tbWFjaGluZSBhdXRoZW50aWNhdGlvbi4gIEEgYEJhbmtgIGNhbiB0aGVuIGdlbmVyYXRlIGBDdXN0b21lcmAgYWNjZXNzIHRva2VucyB2aWEgQVBJIHVzaW5nIG91ciBbSWRlbnRpdGllcyBBUEldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkuICA8Zm9udCBjb2xvcj1cXFwib3JhbmdlXFxcIj4qKuKaoO+4jyBOZXZlciBzaGFyZSB5b3VyIENsaWVudCBJRCBvciBTZWNyZXQgcHVibGljbHkgb3IgaW4geW91ciBzb3VyY2UgY29kZSByZXBvc2l0b3J5LioqPC9mb250PiAgWW91ciBgQ2xpZW50IElEYCBhbmQgYFNlY3JldGAgY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYSB0aW1lLWxpbWl0ZWQgYEJlYXJlciBUb2tlbmAgYnkgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgQ3licmlkIElkZW50aXR5IFByb3ZpZGVyIG9yIHRocm91Z2ggaW50ZXJhY3Rpbmcgd2l0aCB0aGUgKipBdXRob3JpemUqKiBidXR0b24gaW4gdGhpcyBkb2N1bWVudC4gIFRoZSBmb2xsb3dpbmcgY3VybCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZ2VuZXJhdGUgYSBgQmVhcmVyIFRva2VuYCBmb3IgdXNlIGluIHRlc3RpbmcgdGhlIEFQSSBvciBkZW1vIGFwcGxpY2F0aW9ucy4gIGBgYCAjIEV4YW1wbGUgcmVxdWVzdCB3aGVuIHVzaW5nIEJhbmsgY3JlZGVudGlhbHMgY3VybCAtWCBQT1NUIGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL29hdXRoL3Rva2VuIC1kIFxcJ3sgICAgIFxcXCJncmFudF90eXBlXFxcIjogXFxcImNsaWVudF9jcmVkZW50aWFsc1xcXCIsICAgICBcXFwiY2xpZW50X2lkXFxcIjogXFxcIjxZb3VyIENsaWVudCBJRD5cXFwiLCAgICAgXFxcImNsaWVudF9zZWNyZXRcXFwiOiBcXFwiPFlvdXIgU2VjcmV0PlxcXCIsICAgICBcXFwic2NvcGVcXFwiOiBcXFwiYmFua3M6cmVhZCBiYW5rczp3cml0ZSBiYW5rX2FwcGxpY2F0aW9uczpyZWFkIGJhbmtfYXBwbGljYXRpb25zOndyaXRlIGJhbmtfYXBwbGljYXRpb25zOmV4ZWN1dGUgYWNjb3VudHM6cmVhZCBhY2NvdW50czp3cml0ZSBhY2NvdW50czpleGVjdXRlIGNvdW50ZXJwYXJ0aWVzOnJlYWQgY291bnRlcnBhcnRpZXM6cGlpOnJlYWQgY291bnRlcnBhcnRpZXM6d3JpdGUgY291bnRlcnBhcnRpZXM6ZXhlY3V0ZSBjdXN0b21lcnM6cmVhZCBjdXN0b21lcnM6cGlpOnJlYWQgY3VzdG9tZXJzOndyaXRlIGN1c3RvbWVyczpleGVjdXRlIHByaWNlczpyZWFkIHF1b3RlczpleGVjdXRlIHF1b3RlczpyZWFkIHRyYWRlczpleGVjdXRlIHRyYWRlczpyZWFkIHRyYW5zZmVyczpleGVjdXRlIHRyYW5zZmVyczpyZWFkIHRyYW5zZmVyczp3cml0ZSBleHRlcm5hbF9iYW5rX2FjY291bnRzOnJlYWQgZXh0ZXJuYWxfYmFua19hY2NvdW50czpwaWk6cmVhZCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBleHRlcm5hbF93YWxsZXRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czp3cml0ZSBleHRlcm5hbF93YWxsZXRzOmV4ZWN1dGUgd29ya2Zsb3dzOnJlYWQgd29ya2Zsb3dzOmV4ZWN1dGUgZGVwb3NpdF9hZGRyZXNzZXM6cmVhZCBkZXBvc2l0X2FkZHJlc3Nlczp3cml0ZSBkZXBvc2l0X2FkZHJlc3NlczpleGVjdXRlIGRlcG9zaXRfYmFua19hY2NvdW50czpyZWFkIGRlcG9zaXRfYmFua19hY2NvdW50czp3cml0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBpbnZvaWNlczpyZWFkIGludm9pY2VzOndyaXRlIGludm9pY2VzOmV4ZWN1dGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cGlpOnJlYWQgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczp3cml0ZSBpZGVudGl0eV92ZXJpZmljYXRpb25zOmV4ZWN1dGUgcGVyc29uYV9zZXNzaW9uczpleGVjdXRlIHNhcmRpbmVfc2Vzc2lvbnM6ZXhlY3V0ZSBwbGFuczpleGVjdXRlIHBsYW5zOnJlYWQgZXhlY3V0aW9uczpleGVjdXRlIGV4ZWN1dGlvbnM6cmVhZCBmaWxlczpyZWFkIGZpbGVzOnBpaTpyZWFkIGZpbGVzOmV4ZWN1dGVcXFwiICAgfVxcJyAtSCBcXFwiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXFxcIiAgIyBXaGVuIHVzaW5nIE9yZ2FuaXphdGlvbiBjcmVkZW50aWFscyBzZXQgYHNjb3BlYCB0byBcXCdvcmdhbml6YXRpb25zOnJlYWQgb3JnYW5pemF0aW9uczp3cml0ZSBvcmdhbml6YXRpb25fYXBwbGljYXRpb25zOnJlYWQgb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczp3cml0ZSBvcmdhbml6YXRpb25fYXBwbGljYXRpb25zOmV4ZWN1dGUgYmFua3M6cmVhZCBiYW5rczp3cml0ZSBiYW5rczpleGVjdXRlIGJhbmtfYXBwbGljYXRpb25zOnJlYWQgYmFua19hcHBsaWNhdGlvbnM6d3JpdGUgYmFua19hcHBsaWNhdGlvbnM6ZXhlY3V0ZSB1c2VyczpyZWFkIHVzZXJzOndyaXRlIHVzZXJzOmV4ZWN1dGUgY291bnRlcnBhcnRpZXM6cmVhZCBjb3VudGVycGFydGllczpwaWk6cmVhZCBjdXN0b21lcnM6cmVhZCBjdXN0b21lcnM6cGlpOnJlYWQgYWNjb3VudHM6cmVhZCBhY2NvdW50czp3cml0ZSBwcmljZXM6cmVhZCBxdW90ZXM6ZXhlY3V0ZSBxdW90ZXM6cmVhZCB0cmFkZXM6ZXhlY3V0ZSB0cmFkZXM6cmVhZCB0cmFuc2ZlcnM6cmVhZCB0cmFuc2ZlcnM6d3JpdGUgdHJhbnNmZXJzOmV4ZWN1dGUgZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cGlpOnJlYWQgZXh0ZXJuYWxfYmFua19hY2NvdW50czp3cml0ZSBleHRlcm5hbF93YWxsZXRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czp3cml0ZSB3b3JrZmxvd3M6cmVhZCBkZXBvc2l0X2FkZHJlc3NlczpyZWFkIGRlcG9zaXRfYWRkcmVzc2VzOndyaXRlIGRlcG9zaXRfYmFua19hY2NvdW50czpyZWFkIGRlcG9zaXRfYmFua19hY2NvdW50czp3cml0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBpbnZvaWNlczpyZWFkIHN1YnNjcmlwdGlvbnM6cmVhZCBzdWJzY3JpcHRpb25zOndyaXRlIHN1YnNjcmlwdGlvbnM6ZXhlY3V0ZSBzdWJzY3JpcHRpb25fZXZlbnRzOnJlYWQgc3Vic2NyaXB0aW9uX2V2ZW50czpleGVjdXRlIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cmVhZCBpZGVudGl0eV92ZXJpZmljYXRpb25zOnBpaTpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6ZXhlY3V0ZSBwZXJzb25hX3Nlc3Npb25zOmV4ZWN1dGUgc2FyZGluZV9zZXNzaW9uczpleGVjdXRlIHBsYW5zOmV4ZWN1dGUgcGxhbnM6cmVhZCBleGVjdXRpb25zOmV4ZWN1dGUgZXhlY3V0aW9uczpyZWFkIGZpbGVzOnJlYWQgZmlsZXM6cGlpOnJlYWQgZmlsZXM6ZXhlY3V0ZVxcJyBgYGAgPGZvbnQgY29sb3I9XFxcIm9yYW5nZVxcXCI+KirimqDvuI8gTm90ZTogVGhlIGFib3ZlIGN1cmwgd2lsbCBjcmVhdGUgYSBiZWFyZXIgdG9rZW4gd2l0aCBmdWxsIHNjb3BlIGFjY2Vzcy4gRGVsZXRlIHNjb3BlcyBpZiB5b3VcXCdkIGxpa2UgdG8gcmVzdHJpY3QgYWNjZXNzLioqPC9mb250PiAgIyMgQXV0aGVudGljYXRpb24gU2NvcGVzICBUaGUgQ3licmlkIHBsYXRmb3JtIHN1cHBvcnRzIHRoZSB1c2Ugb2Ygc2NvcGVzIHRvIGNvbnRyb2wgdGhlIGxldmVsIG9mIGFjY2VzcyBhIHRva2VuIGlzIGxpbWl0ZWQgdG8uIFNjb3BlcyBkbyBub3QgZ3JhbnQgYWNjZXNzIHRvIHJlc291cmNlczsgaW5zdGVhZCwgdGhleSBwcm92aWRlIGxpbWl0cywgaW4gc3VwcG9ydCBvZiB0aGUgbGVhc3QgcHJpdmlsZWdlIHByaW5jaXBhbC4gIFRoZSBmb2xsb3dpbmcgc2NvcGVzIGFyZSBhdmFpbGFibGUgb24gdGhlIHBsYXRmb3JtIGFuZCBjYW4gYmUgcmVxdWVzdGVkIHdoZW4gZ2VuZXJhdGluZyBlaXRoZXIgYW4gT3JnYW5pemF0aW9uLCBCYW5rIG9yIEN1c3RvbWVyIHRva2VuLiBHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZSBfUmVhZF8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gcmVhZCBhbmQgbGlzdCByZXNvdXJjZXMsIHRoZSBfV3JpdGVfIHNjb3BlIGlzIHJlcXVpcmVkIHRvIHVwZGF0ZSBhIHJlc291cmNlIGFuZCB0aGUgX0V4ZWN1dGVfIHNjb3BlIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHJlc291cmNlLiAgfCBSZXNvdXJjZSAgICAgICAgICAgICAgfCBSZWFkIHNjb3BlIChUb2tlbiBUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV3JpdGUgc2NvcGUgKFRva2VuIFR5cGUpICAgICAgICAgICAgICAgICAgICAgIHwgRXhlY3V0ZSBzY29wZSAoVG9rZW4gVHlwZSkgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfCBBY2NvdW50ICAgICAgICAgICAgICAgfCBhY2NvdW50czpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWNjb3VudHM6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgICAgICAgICAgfCBiYW5rczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmspICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmFua3M6d3JpdGUgKE9yZ2FuaXphdGlvbiwgQmFuaykgICAgICAgICAgICAgIHwgYmFua3M6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgIHwgfCBDdXN0b21lciAgICAgICAgICAgICAgfCBjdXN0b21lcnM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgIHwgY3VzdG9tZXJzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgIHwgY3VzdG9tZXJzOmV4ZWN1dGUgKEJhbmspICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBDb3VudGVycGFydHkgICAgICAgICAgfCBjb3VudGVycGFydGllczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgIHwgY291bnRlcnBhcnRpZXM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgIHwgY291bnRlcnBhcnRpZXM6ZXhlY3V0ZSAoQmFuaykgICAgICAgICAgICAgICAgICAgIHwgfCBEZXBvc2l0IEFkZHJlc3MgICAgICAgfCBkZXBvc2l0X2FkZHJlc3NlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgIHwgZGVwb3NpdF9hZGRyZXNzZXM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSAgICAgIHwgZGVwb3NpdF9hZGRyZXNzZXM6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgIHwgfCBFeHRlcm5hbCBCYW5rIEFjY291bnQgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpIHwgZXh0ZXJuYWxfYmFua19hY2NvdW50czp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpIHwgZXh0ZXJuYWxfYmFua19hY2NvdW50czpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgIHwgfCBFeHRlcm5hbCBXYWxsZXQgICAgICAgfCBleHRlcm5hbF93YWxsZXQ6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0ZXJuYWxfd2FsbGV0OmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgIHwgfCBPcmdhbml6YXRpb24gICAgICAgICAgfCBvcmdhbml6YXRpb25zOnJlYWQgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3JnYW5pemF0aW9uczp3cml0ZSAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBVc2VyICAgICAgICAgICAgICAgICAgfCB1c2VyczpyZWFkIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXNlcnM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgIHwgfCBQcmljZSAgICAgICAgICAgICAgICAgfCBwcmljZXM6cmVhZCAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBRdW90ZSAgICAgICAgICAgICAgICAgfCBxdW90ZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXVvdGVzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgIHwgfCBUcmFkZSAgICAgICAgICAgICAgICAgfCB0cmFkZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhZGVzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgIHwgfCBUcmFuc2ZlciAgICAgICAgICAgICAgfCB0cmFuc2ZlcnM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNmZXJzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpIHwgfCBXb3JrZmxvdyAgICAgICAgICAgICAgfCB3b3JrZmxvd3M6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd29ya2Zsb3dzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgIHwgfCBJbnZvaWNlICAgICAgICAgICAgICAgfCBpbnZvaWNlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgIHwgaW52b2ljZXM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgIHwgaW52b2ljZXM6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgIHwgICMjIEF2YWlsYWJsZSBFbmRwb2ludHMgIFRoZSBhdmFpbGFibGUgQVBJcyBmb3IgdGhlIFtJZGVudGl0eV0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSwgW09yZ2FuaXphdGlvbl0oaHR0cHM6Ly9vcmdhbml6YXRpb24ucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgYW5kIFtCYW5rXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgQVBJIHNlcnZpY2VzIGFyZSBsaXN0ZWQgYmVsb3c6ICB8IEFQSSBTZXJ2aWNlICB8IE1vZGVsICAgICAgICAgICAgICAgIHwgQVBJIEVuZHBvaW50IFBhdGggICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfCBJZGVudGl0eSAgICAgfCBCYW5rICAgICAgICAgICAgICAgICB8IC9hcGkvYmFua19hcHBsaWNhdGlvbnMgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBiYW5rcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IElkZW50aXR5ICAgICB8IEN1c3RvbWVyVG9rZW4gICAgICAgIHwgL2FwaS9jdXN0b21lcl90b2tlbnMgICAgICAgICAgIHwgQ3JlYXRlIGN1c3RvbWVyIEpXVCBhY2Nlc3MgdG9rZW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgSWRlbnRpdHkgICAgIHwgT3JnYW5pemF0aW9uICAgICAgICAgfCAvYXBpL29yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnMgfCBDcmVhdGUgYW5kIGxpc3Qgb3JnYW5pemF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBJZGVudGl0eSAgICAgfCBPcmdhbml6YXRpb24gICAgICAgICB8IC9hcGkvdXNlcnMgICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBvcmdhbml6YXRpb24gdXNlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IE9yZ2FuaXphdGlvbiB8IE9yZ2FuaXphdGlvbiAgICAgICAgIHwgL2FwaS9vcmdhbml6YXRpb25zICAgICAgICAgICAgIHwgQVBJcyB0byByZXRyaWV2ZSBhbmQgdXBkYXRlIG9yZ2FuaXphdGlvbiBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQWNjb3VudCAgICAgICAgICAgICAgfCAvYXBpL2FjY291bnRzICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgYWNjb3VudHMsIHdoaWNoIGhvbGQgYSBzcGVjaWZpYyBhc3NldCBmb3IgYSBjdXN0b21lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBBc3NldCAgICAgICAgICAgICAgICB8IC9hcGkvYXNzZXRzICAgICAgICAgICAgICAgICAgICB8IEdldCBhIGxpc3Qgb2YgYXNzZXRzIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0gKGV4OiBCVEMsIEVUSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEJhbmsgICAgICAgICAgICAgICAgIHwgL2FwaS9iYW5rcyAgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCB1cGRhdGUgYW5kIGxpc3QgYmFua3MsIHRoZSBwYXJlbnQgdG8gY3VzdG9tZXJzLCBhY2NvdW50cywgZXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQ3VzdG9tZXIgICAgICAgICAgICAgfCAvYXBpL2N1c3RvbWVycyAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgY3VzdG9tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBDb3VudGVycGFydHkgICAgICAgICB8IC9hcGkvY291bnRlcnBhcnRpZXMgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBjb3VudGVycGFydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IERlcG9zaXRBZGRyZXNzICAgICAgIHwgL2FwaS9kZXBvc2l0X2FkZHJlc3NlcyAgICAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgZGVwb3NpdCBhZGRyZXNzZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgRXh0ZXJuYWxCYW5rQWNjb3VudCAgfCAvYXBpL2V4dGVybmFsX2JhbmtfYWNjb3VudHMgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCBleHRlcm5hbCBiYW5rIGFjY291bnRzLCB3aGljaCBjb25uZWN0IGN1c3RvbWVyIGJhbmsgYWNjb3VudHMgdG8gdGhlIHBsYXRmb3JtIHwgfCBCYW5rICAgICAgICAgfCBFeHRlcm5hbFdhbGxldCAgICAgICB8IC9hcGkvZXh0ZXJuYWxfd2FsbGV0cyAgICAgICAgICB8IENyZWF0ZSwgZ2V0LCBsaXN0IGFuZCBkZWxldGUgZXh0ZXJuYWwgd2FsbGV0cywgd2hpY2ggY29ubmVjdCBjdXN0b21lciB3YWxsZXRzIHRvIHRoZSBwbGF0Zm9ybSAgICAgfCB8IEJhbmsgICAgICAgICB8IElkZW50aXR5VmVyaWZpY2F0aW9uIHwgL2FwaS9pZGVudGl0eV92ZXJpZmljYXRpb25zICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGlkZW50aXR5IHZlcmlmaWNhdGlvbnMsIHdoaWNoIGFyZSBwZXJmb3JtZWQgb24gY3VzdG9tZXJzIGZvciBLWUMgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgSW52b2ljZSAgICAgICAgICAgICAgfCAvYXBpL2ludm9pY2VzICAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIGdldCwgY2FuY2VsIGFuZCBsaXN0IGludm9pY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBQYXltZW50SW5zdHJ1Y3Rpb24gICB8IC9hcGkvcGF5bWVudF9pbnN0cnVjdGlvbnMgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IHBheW1lbnQgaW5zdHJ1Y3Rpb25zIGZvciBpbnZvaWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFByaWNlICAgICAgICAgICAgICAgIHwgL2FwaS9wcmljZXMgICAgICAgICAgICAgICAgICAgIHwgR2V0IHRoZSBjdXJyZW50IHByaWNlcyBmb3IgYXNzZXRzIG9uIHRoZSBwbGF0Zm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgUXVvdGUgICAgICAgICAgICAgICAgfCAvYXBpL3F1b3RlcyAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgcXVvdGVzLCB3aGljaCBhcmUgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0cmFkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBTeW1ib2wgICAgICAgICAgICAgICB8IC9hcGkvc3ltYm9scyAgICAgICAgICAgICAgICAgICB8IEdldCBhIGxpc3Qgb2Ygc3ltYm9scyBzdXBwb3J0ZWQgZm9yIHRyYWRlIChleDogQlRDLVVTRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFRyYWRlICAgICAgICAgICAgICAgIHwgL2FwaS90cmFkZXMgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IHRyYWRlcywgd2hpY2ggYnV5IG9yIHNlbGwgY3J5cHRvY3VycmVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgVHJhbnNmZXIgICAgICAgICAgICAgfCAvYXBpL3RyYW5zZmVycyAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCB0cmFuc2ZlcnMgKGUuZy4sIGZ1bmRpbmcsIGJvb2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBXb3JrZmxvdyAgICAgICAgICAgICB8IC9hcGkvd29ya2Zsb3dzICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IHdvcmtmbG93cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIyMgVW5kZXJzdGFuZGluZyBPYmplY3QgTW9kZWxzICYgRW5kcG9pbnRzICAqKk9yZ2FuaXphdGlvbnMqKiAgQW4gYE9yZ2FuaXphdGlvbmAgaXMgbWVhbnQgdG8gcmVwcmVzZW50IHRoZSBvcmdhbml6YXRpb24gcGFydG5lcmluZyB3aXRoIEN5YnJpZCB0byB1c2Ugb3VyIHBsYXRmb3JtLiAgQW4gYE9yZ2FuaXphdGlvbmAgdHlwaWNhbGx5IGRvZXMgbm90IGRpcmVjdGx5IGludGVyYWN0IHdpdGggYGN1c3RvbWVyc2AuIEluc3RlYWQsIGFuIE9yZ2FuaXphdGlvbiBoYXMgb25lIG9yIG1vcmUgYGJhbmtzYCwgd2hpY2ggZW5jb21wYXNzIHRoZSBmaW5hbmNpYWwgc2VydmljZSBvZmZlcmluZ3Mgb2YgdGhlIHBsYXRmb3JtLiAgKipCYW5rcyoqICBBIGBCYW5rYCBpcyBvd25lZCBieSBhbiBgT3JnYW5pemF0aW9uYCBhbmQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYW4gZW52aXJvbm1lbnQgb3IgY29udGFpbmVyIGZvciBgY3VzdG9tZXJzYCBhbmQgcHJvZHVjdCBvZmZlcmluZ3MuIEJhbmtzIGFyZSBjcmVhdGVkIGluIGVpdGhlciBgU2FuZGJveGAgb3IgYFByb2R1Y3Rpb25gIG1vZGUsIHdoZXJlIGBTYW5kYm94YCBpcyB0aGUgZW52aXJvbm1lbnQgdGhhdCB5b3Ugd291bGQgdGVzdCwgcHJvdG90eXBlIGFuZCBidWlsZCBpbiBwcmlvciB0byBtb3ZpbmcgdG8gYFByb2R1Y3Rpb25gLiAgQW4gYE9yZ2FuaXphdGlvbmAgY2FuIGhhdmUgbXVsdGlwbGUgYGJhbmtzYCwgaW4gZWl0aGVyIGBTYW5kYm94YCBvciBgUHJvZHVjdGlvbmAgZW52aXJvbm1lbnRzLiBBIGBTYW5kYm94IEJhbmtgIHdpbGwgYmUgYmFja2VkIGJ5IHN0dWJiZWQgZGF0YSBhbmQgcHJvY2VzcyBmbG93cy4gRm9yIGluc3RhbmNlLCBmdW5kaW5nIHNvdXJjZSB0cmFuc2ZlciBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0cmFkZXMgd2lsbCBiZSBzaW11bGF0ZWQgcmF0aGVyIHRoYW4gcGVyZm9ybWVkLCBob3dldmVyIGFzc2V0IHByaWNlcyBhcmUgcmVwcmVzZW50YXRpdmUgb2YgcmVhbC13b3JsZCB2YWx1ZXMuIFlvdSBoYXZlIGFuIHVubGltaXRlZCBhbW91bnQgb2Ygc2ltdWxhdGVkIGZpYXQgY3VycmVuY3kgZm9yIHRlc3RpbmcgcHVycG9zZXMuICAqKkN1c3RvbWVycyoqICBgQ3VzdG9tZXJzYCByZXByZXNlbnQgeW91ciBiYW5raW5nIHVzZXJzIG9uIHRoZSBwbGF0Zm9ybS4gQXQgcHJlc2VudCwgd2Ugb2ZmZXIgc3VwcG9ydCBmb3IgYEluZGl2aWR1YWxzYCBhcyBDdXN0b21lcnMuICBgQ3VzdG9tZXJzYCBtdXN0IGJlIHZlcmlmaWVkIChpLmUuLCBLWUNcXCdkKSBpbiBvdXIgc3lzdGVtIGJlZm9yZSB0aGV5IGNhbiBwbGF5IGFueSBwYXJ0IG9uIHRoZSBwbGF0Zm9ybSwgd2hpY2ggbWVhbnMgdGhleSBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBhbmQgYSBwYXNzaW5nIGBJZGVudGl0eSBWZXJpZmljYXRpb25gLiBTZWUgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbnMgc2VjdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyBhIGN1c3RvbWVyIGNhbiBiZSB2ZXJpZmllZC4gIGBDdXN0b21lcnNgIG11c3QgYWxzbyBoYXZlIGFuIGBBY2NvdW50YCB0byBiZSBhYmxlIHRvIHRyYW5zYWN0LCBpbiB0aGUgZGVzaXJlZCBhc3NldCBjbGFzcy4gU2VlIHRoZSBBY2NvdW50cyBBUElzIGZvciBtb3JlIGRldGFpbHMgb24gc2V0dGluZyB1cCBhY2NvdW50cyBmb3IgdGhlIGN1c3RvbWVyLiBcbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogdjAuMTI5Ljc1MVxuICogQ29udGFjdDogc3VwcG9ydEBjeWJyaWQuYXBwXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtdmFyaWFibGUgbWVtYmVyLW9yZGVyaW5nICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLFxuICAgICAgICAgSHR0cFJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBQYXJhbWV0ZXJDb2RlYywgSHR0cENvbnRleHQgXG4gICAgICAgIH0gICAgICAgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjIH0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2VuY29kZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ3J4anMnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBDdXN0b21lclRva2VuSWRwTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9jdXN0b21lclRva2VuJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEVycm9yUmVzcG9uc2VJZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL2Vycm9yUmVzcG9uc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL3Bvc3RDdXN0b21lclRva2VuJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMgfSAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5cblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21lclRva2Vuc1NlcnZpY2Uge1xuXG4gICAgcHJvdGVjdGVkIGJhc2VQYXRoID0gJ2h0dHBzOi8vaWQuc2FuZGJveC5jeWJyaWQuYXBwJztcbiAgICBwdWJsaWMgZGVmYXVsdEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgcHVibGljIGVuY29kZXI6IEh0dHBQYXJhbWV0ZXJDb2RlYztcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKUBJbmplY3QoQkFTRV9QQVRIKSBiYXNlUGF0aDogc3RyaW5nLCBAT3B0aW9uYWwoKSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBiYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuY29kZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlciB8fCBuZXcgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjKCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtcyhodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXM6IEh0dHBQYXJhbXMsIHZhbHVlPzogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgKHZhbHVlIGFzIGFueVtdKS5mb3JFYWNoKCBlbGVtID0+IGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCBlbGVtLCBrZXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksICh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpLnN1YnN0cigwLCAxMCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIERhdGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaCggayA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoXG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMsIHZhbHVlW2tdLCBrZXkgIT0gbnVsbCA/IGAke2tleX0uJHtrfWAgOiBrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBjdXN0b21lciBhY2Nlc3MgdG9rZW5cbiAgICAgKiBDcmVhdGVzIGEgY3VzdG9tZXIgSldUIGFjY2VzcyB0b2tlbi4gIFJlcXVpcmVkIHNjb3BlczogKipjdXN0b21lcnM6d3JpdGUqKiBhbmQgKipjdXN0b21lcnM6cmVhZCoqXG4gICAgICogQHBhcmFtIHBvc3RDdXN0b21lclRva2VuSWRwTW9kZWwgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUN1c3RvbWVyVG9rZW4ocG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbDogUG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbCwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEN1c3RvbWVyVG9rZW5JZHBNb2RlbD47XG4gICAgcHVibGljIGNyZWF0ZUN1c3RvbWVyVG9rZW4ocG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbDogUG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbCwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8Q3VzdG9tZXJUb2tlbklkcE1vZGVsPj47XG4gICAgcHVibGljIGNyZWF0ZUN1c3RvbWVyVG9rZW4ocG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbDogUG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbCwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEN1c3RvbWVyVG9rZW5JZHBNb2RlbD4+O1xuICAgIHB1YmxpYyBjcmVhdGVDdXN0b21lclRva2VuKHBvc3RDdXN0b21lclRva2VuSWRwTW9kZWw6IFBvc3RDdXN0b21lclRva2VuSWRwTW9kZWwsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKHBvc3RDdXN0b21lclRva2VuSWRwTW9kZWwgPT09IG51bGwgfHwgcG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBwb3N0Q3VzdG9tZXJUb2tlbklkcE1vZGVsIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlQ3VzdG9tZXJUb2tlbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxDdXN0b21lclRva2VuSWRwTW9kZWw+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL2N1c3RvbWVyX3Rva2Vuc2AsXG4gICAgICAgICAgICBwb3N0Q3VzdG9tZXJUb2tlbklkcE1vZGVsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxufVxuIl19
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tZXJUb2tlbnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FwaS9jdXN0b21lclRva2Vucy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUNzQixXQUFXLEVBQ3hELE1BQVksc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQStCLFlBQVksQ0FBQztBQVUvRSxhQUFhO0FBQ2IsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBMEIsY0FBYyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBMEMsa0JBQWtCLENBQUM7Ozs7QUFPckYsTUFBTSxPQUFPLHFCQUFxQjtJQU85QixZQUFzQixVQUFzQixFQUFnQyxRQUFnQixFQUFjLGFBQTRCO1FBQWhILGVBQVUsR0FBVixVQUFVLENBQVk7UUFMbEMsYUFBUSxHQUFHLCtCQUErQixDQUFDO1FBQzlDLG1CQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxrQkFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFJdkMsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztTQUN0QztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDakQsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7Z0JBQzlCLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQzFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJ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YSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtpQkFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGdDQUFnQyxDQUFDLEVBQUU7Z0JBQ3hFLGFBQWEsR0FBRyxNQUFNLENBQUM7YUFDMUI7aUJBQU07Z0JBQ0gsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBd0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsc0JBQXNCLEVBQ25HLHlCQUF5QixFQUN6QjtZQUNJLE9BQU8sRUFBRSxtQkFBbUI7WUFDNUIsWUFBWSxFQUFPLGFBQWE7WUFDaEMsZUFBZSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZTtZQUNuRCxPQUFPLEVBQUUsZUFBZTtZQUN4QixPQUFPLEVBQUUsT0FBTztZQUNoQixjQUFjLEVBQUUsY0FBYztTQUNqQyxDQUNKLENBQUM7SUFDTixDQUFDOzttSEF2SVEscUJBQXFCLDRDQU9tQyxTQUFTO3VIQVBqRSxxQkFBcUIsY0FGcEIsTUFBTTs0RkFFUCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFRa0QsUUFBUTs7MEJBQUcsTUFBTTsyQkFBQyxTQUFTOzswQkFBcUIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3licmlkIElkZW50aXR5IEFQSVxuICogIyBDeWJyaWQgQVBJIGRvY3VtZW50YXRpb24gIFdlbGNvbWUgdG8gQ3licmlkLCBhbiBhbGwtaW4tb25lIGNyeXB0byBwbGF0Zm9ybSB0aGF0IGVuYWJsZXMgeW91IHRvIGVhc2lseSAqKmJ1aWxkKiogYW5kICoqbGF1bmNoKiogd2hpdGUtbGFiZWwgY3J5cHRvIHByb2R1Y3RzIG9yIHNlcnZpY2VzLiAgSW4gdGhlc2UgZG9jdW1lbnRzLCB5b3VcXCdsbCBmaW5kIGRldGFpbHMgb24gaG93IG91ciBSRVNUIEFQSSBvcGVyYXRlcyBhbmQgZ2VuZXJhbGx5IGhvdyBvdXIgcGxhdGZvcm0gZnVuY3Rpb25zLiAgSWYgeW91XFwncmUgbG9va2luZyBmb3Igb3VyIFVJIFNESyBXaWRnZXRzIGZvciBXZWIgb3IgTW9iaWxlIChpT1MvQW5kcm9pZCksIGdlbmVyYXRlZCBBUEkgY2xpZW50cywgb3IgZGVtbyBhcHBsaWNhdGlvbnMsIGhlYWQgb3ZlciB0byBvdXIgW0dpdGh1YiByZXBvXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcCkuICDwn5KhIFdlIHJlY29tbWVuZCBib29rbWFya2luZyB0aGUgW0N5YnJpZCBMaW5rVHJlZV0oaHR0cHM6Ly9saW5rdHIuZWUvY3licmlkdGVjaG5vbG9naWVzKSB3aGljaCBjb250YWlucyBtYW55IGhlbHBmdWwgbGlua3MgdG8gcGxhdGZvcm0gcmVzb3VyY2VzLiAgIyMgR2V0dGluZyBTdGFydGVkICBUaGlzIGlzIEN5YnJpZFxcJ3MgcHVibGljIGludGVyYWN0aXZlIEFQSSBkb2N1bWVudGF0aW9uLCB3aGljaCBhbGxvd3MgeW91IHRvIGZ1bGx5IHRlc3Qgb3VyIEFQSXMuIElmIHlvdVxcJ2QgbGlrZSB0byB1c2UgYSBkaWZmZXJlbnQgdG9vbCB0byBleGVyY2lzZSBvdXIgQVBJcywgeW91IGNhbiBkb3dubG9hZCB0aGUgW09wZW4gQVBJIDMuMCB5YW1sXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvdjEvc3dhZ2dlci55YW1sKSBmb3IgaW1wb3J0LiAgSWYgeW91XFwncmUgbmV3IHRvIG91ciBBUElzIGFuZCB0aGUgQ3licmlkIFBsYXRmb3JtLCBmb2xsb3cgdGhlIGJlbG93IGd1aWRlcyB0byBnZXQgc2V0IHVwIGFuZCBmYW1pbGlhciB3aXRoIHRoZSBwbGF0Zm9ybTogIDEuIFtJbnRyb2R1Y3Rpb25dKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaW50cm9kdWN0aW9uKSAyLiBbUGxhdGZvcm0gT3ZlcnZpZXddKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvcGxhdGZvcm0tb3ZlcnZpZXcpIDMuIFtUZXN0aW5nIHdpdGggSG9zdGVkIFdlYiBEZW1vIEFwcF0oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy9ob3N0ZWQtZGVtby1hcHApICBJbiBbR2V0dGluZyBTdGFydGVkIGluIHRoZSBDeWJyaWQgU2FuZGJveF0oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy9jeWJyaWQtc2FuZGJveCksIHdlIHdhbGsgeW91IHRocm91Z2ggaG93IHRvIHVzZSB0aGUgW0N5YnJpZCBTYW5kYm94XShodHRwczovL2lkLnNhbmRib3guY3licmlkLmFwcC8pIHRvIGNyZWF0ZSBhIHRlc3QgYmFuayBhbmQgZ2VuZXJhdGUgQVBJIGtleXMuIEluIFtHZXR0aW5nIFJlYWR5IGZvciBUcmFkaW5nXShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL3RyYWRlLXByb2Nlc3MpLCB3ZSB3YWxrIHRocm91Z2ggY3JlYXRpbmcgY3VzdG9tZXJzLCBjdXN0b21lciBpZGVudGl0aWVzLCBhY2NvdW50cywgYXMgd2VsbCBhcyBleGVjdXRpbmcgcXVvdGVzIGFuZCB0cmFkZXMuICAjIyBXb3JraW5nIHdpdGggdGhlIEN5YnJpZCBQbGF0Zm9ybSAgVGhlcmUgYXJlIHRocmVlIHByaW1hcnkgd2F5cyB5b3UgY2FuIGludGVyYWN0IHdpdGggdGhlIEN5YnJpZCBwbGF0Zm9ybTogIDEuIERpcmVjdGx5IHZpYSBvdXIgUkVTVGZ1bCBBUEkgKHRoaXMgZG9jdW1lbnRhdGlvbikgMi4gVXNpbmcgb3VyIEFQSSBjbGllbnRzIGF2YWlsYWJsZSBpbiBhIHZhcmlldHkgb2YgbGFuZ3VhZ2VzIChbQW5ndWxhcl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWFuZ3VsYXIpLCBbSmF2YV0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWphdmEpLCBbS290bGluXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmsta290bGluKSwgW1B5dGhvbl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXB5dGhvbiksIFtSdWJ5XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstcnVieSksIFtTd2lmdF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXN3aWZ0KSBvciBbVHlwZXNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXR5cGVzY3JpcHQpKSAzLiBJbnRlZ3JhdGluZyBhIHBsYXRmb3JtIHNwZWNpZmljIFNESyAoW1dlYl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay13ZWIpLCBbQW5kcm9pZF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay1hbmRyb2lkKSwgW2lPU10oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay1pb3MpKSAgT3VyIGNvbXBsZXRlIHNldCBvZiBBUElzIGFsbG93cyB5b3UgdG8gbWFuYWdlIHJlc291cmNlcyBhY3Jvc3MgdGhyZWUgZGlzdGluY3QgYXJlYXM6IHlvdXIgYE9yZ2FuaXphdGlvbmAsIHlvdXIgYEJhbmtzYCBhbmQgeW91ciBgSWRlbnRpdGllc2AuIEZvciBtb3N0IG9mIHlvdXIgdGVzdGluZyBhbmQgaW50ZXJhY3Rpb24geW91XFwnbGwgYmUgdXNpbmcgdGhlIGBCYW5rYCBBUEksIHdoaWNoIGlzIHdoZXJlIHRoZSBtYWpvcml0eSBvZiBBUElzIHJlc2lkZS4gICpUaGUgY29tcGxldGUgc2V0IG9mIEFQSXMgY2FuIGJlIGZvdW5kIG9uIHRoZSBmb2xsb3dpbmcgcGFnZXM6KiAgfCBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgW09yZ2FuaXphdGlvbiBBUEldKGh0dHBzOi8vb3JnYW5pemF0aW9uLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgfCBBUElzIHRvIG1hbmFnZSBvcmdhbml6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgW0JhbmsgQVBJXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICAgICAgICAgICAgICAgICAgfCBBUElzIHRvIG1hbmFnZSBiYW5rcyAoYW5kIGFsbCBkb3duc3RyZWFtIGN1c3RvbWVyIGFjdGl2aXR5KSB8IHwgW0lkZW50aXRpZXMgQVBJXShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgICAgICAgICAgICAgICAgICAgICB8IEFQSXMgdG8gbWFuYWdlIG9yZ2FuaXphdGlvbiBhbmQgYmFuayBpZGVudGl0aWVzICAgICAgICAgICAgIHwgIEZvciBxdWVzdGlvbnMgcGxlYXNlIGNvbnRhY3QgW1N1cHBvcnRdKG1haWx0bzpzdXBwb3J0QGN5YnJpZC54eXopIGF0IGFueSB0aW1lIGZvciBhc3Npc3RhbmNlLCBvciBjb250YWN0IHRoZSBbUHJvZHVjdCBUZWFtXShtYWlsdG86cHJvZHVjdEBjeWJyaWQueHl6KSBmb3IgcHJvZHVjdCBzdWdnZXN0aW9ucy4gICMjIEF1dGhlbnRpY2F0aW5nIHdpdGggdGhlIEFQSSAgVGhlIEN5YnJpZCBQbGF0Zm9ybSB1c2VzIE9BdXRoIDIuMCBCZWFyZXIgVG9rZW5zIHRvIGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyB0byB0aGUgcGxhdGZvcm0uIENyZWRlbnRpYWxzIHRvIGNyZWF0ZSBgT3JnYW5pemF0aW9uYCBhbmQgYEJhbmtgIHRva2VucyBjYW4gYmUgZ2VuZXJhdGVkIHZpYSB0aGUgW0N5YnJpZCBTYW5kYm94XShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcCkuIEFjY2VzcyB0b2tlbnMgY2FuIGJlIGdlbmVyYXRlZCBmb3IgYSBgQ3VzdG9tZXJgIGFzIHdlbGwgdmlhIHRoZSBbQ3licmlkIElkUF0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHApIGFzIHdlbGwuICBBbiBgT3JnYW5pemF0aW9uYCBhY2Nlc3MgdG9rZW4gYXBwbGllcyBicm9hZGx5IHRvIHRoZSB3aG9sZSBPcmdhbml6YXRpb24gYW5kIGFsbCBvZiBpdHMgYEJhbmtzYCwgd2hlcmVhcywgYSBgQmFua2AgYWNjZXNzIHRva2VuIGlzIHNwZWNpZmljIHRvIGFuIGluZGl2aWR1YWwgQmFuay4gYEN1c3RvbWVyYCB0b2tlbnMsIHNpbWlsYXJseSwgYXJlIHNjb3BlZCB0byBhIHNwZWNpZmljIGN1c3RvbWVyIGluIGEgYmFuay4gIEJvdGggYE9yZ2FuaXphdGlvbmAgYW5kIGBCYW5rYCB0b2tlbnMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIE9BdXRoIENsaWVudCBDcmVkZW50aWFsIEdyYW50IGZsb3cuIEVhY2ggT3JnYW5pemF0aW9uIGFuZCBCYW5rIGhhcyBpdHMgb3duIHVuaXF1ZSBgQ2xpZW50IElEYCBhbmQgYFNlY3JldGAgdGhhdCBhbGxvd3MgZm9yIG1hY2hpbmUtdG8tbWFjaGluZSBhdXRoZW50aWNhdGlvbi4gIEEgYEJhbmtgIGNhbiB0aGVuIGdlbmVyYXRlIGBDdXN0b21lcmAgYWNjZXNzIHRva2VucyB2aWEgQVBJIHVzaW5nIG91ciBbSWRlbnRpdGllcyBBUEldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkuICA8Zm9udCBjb2xvcj1cXFwib3JhbmdlXFxcIj4qKuKaoO+4jyBOZXZlciBzaGFyZSB5b3VyIENsaWVudCBJRCBvciBTZWNyZXQgcHVibGljbHkgb3IgaW4geW91ciBzb3VyY2UgY29kZSByZXBvc2l0b3J5LioqPC9mb250PiAgWW91ciBgQ2xpZW50IElEYCBhbmQgYFNlY3JldGAgY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYSB0aW1lLWxpbWl0ZWQgYEJlYXJlciBUb2tlbmAgYnkgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgQ3licmlkIElkZW50aXR5IFByb3ZpZGVyIG9yIHRocm91Z2ggaW50ZXJhY3Rpbmcgd2l0aCB0aGUgKipBdXRob3JpemUqKiBidXR0b24gaW4gdGhpcyBkb2N1bWVudC4gIFRoZSBmb2xsb3dpbmcgY3VybCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZ2VuZXJhdGUgYSBgQmVhcmVyIFRva2VuYCBmb3IgdXNlIGluIHRlc3RpbmcgdGhlIEFQSSBvciBkZW1vIGFwcGxpY2F0aW9ucy4gIGBgYCAjIEV4YW1wbGUgcmVxdWVzdCB3aGVuIHVzaW5nIEJhbmsgY3JlZGVudGlhbHMgY3VybCAtWCBQT1NUIGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL29hdXRoL3Rva2VuIC1kIFxcJ3sgICAgIFxcXCJncmFudF90eXBlXFxcIjogXFxcImNsaWVudF9jcmVkZW50aWFsc1xcXCIsICAgICBcXFwiY2xpZW50X2lkXFxcIjogXFxcIjxZb3VyIENsaWVudCBJRD5cXFwiLCAgICAgXFxcImNsaWVudF9zZWNyZXRcXFwiOiBcXFwiPFlvdXIgU2VjcmV0PlxcXCIsICAgICBcXFwic2NvcGVcXFwiOiBcXFwiYmFua3M6cmVhZCBiYW5rczp3cml0ZSBiYW5rX2FwcGxpY2F0aW9uczpyZWFkIGJhbmtfYXBwbGljYXRpb25zOndyaXRlIGJhbmtfYXBwbGljYXRpb25zOmV4ZWN1dGUgYWNjb3VudHM6cmVhZCBhY2NvdW50czp3cml0ZSBhY2NvdW50czpleGVjdXRlIGNvdW50ZXJwYXJ0aWVzOnJlYWQgY291bnRlcnBhcnRpZXM6cGlpOnJlYWQgY291bnRlcnBhcnRpZXM6d3JpdGUgY291bnRlcnBhcnRpZXM6ZXhlY3V0ZSBjdXN0b21lcnM6cmVhZCBjdXN0b21lcnM6cGlpOnJlYWQgY3VzdG9tZXJzOndyaXRlIGN1c3RvbWVyczpleGVjdXRlIHByaWNlczpyZWFkIHF1b3RlczpleGVjdXRlIHF1b3RlczpyZWFkIHRyYWRlczpleGVjdXRlIHRyYWRlczpyZWFkIHRyYW5zZmVyczpleGVjdXRlIHRyYW5zZmVyczpyZWFkIHRyYW5zZmVyczp3cml0ZSBleHRlcm5hbF9iYW5rX2FjY291bnRzOnJlYWQgZXh0ZXJuYWxfYmFua19hY2NvdW50czpwaWk6cmVhZCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBleHRlcm5hbF93YWxsZXRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czp3cml0ZSBleHRlcm5hbF93YWxsZXRzOmV4ZWN1dGUgd29ya2Zsb3dzOnJlYWQgd29ya2Zsb3dzOmV4ZWN1dGUgZGVwb3NpdF9hZGRyZXNzZXM6cmVhZCBkZXBvc2l0X2FkZHJlc3Nlczp3cml0ZSBkZXBvc2l0X2FkZHJlc3NlczpleGVjdXRlIGRlcG9zaXRfYmFua19hY2NvdW50czpyZWFkIGRlcG9zaXRfYmFua19hY2NvdW50czp3cml0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBpbnZvaWNlczpyZWFkIGludm9pY2VzOndyaXRlIGludm9pY2VzOmV4ZWN1dGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cGlpOnJlYWQgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczp3cml0ZSBpZGVudGl0eV92ZXJpZmljYXRpb25zOmV4ZWN1dGUgcGVyc29uYV9zZXNzaW9uczpleGVjdXRlIHNhcmRpbmVfc2Vzc2lvbnM6ZXhlY3V0ZSBwbGFuczpleGVjdXRlIHBsYW5zOnJlYWQgZXhlY3V0aW9uczpleGVjdXRlIGV4ZWN1dGlvbnM6cmVhZCBmaWxlczpyZWFkIGZpbGVzOnBpaTpyZWFkIGZpbGVzOmV4ZWN1dGVcXFwiICAgfVxcJyAtSCBcXFwiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXFxcIiAgIyBXaGVuIHVzaW5nIE9yZ2FuaXphdGlvbiBjcmVkZW50aWFscyBzZXQgYHNjb3BlYCB0byBcXCdvcmdhbml6YXRpb25zOnJlYWQgb3JnYW5pemF0aW9uczp3cml0ZSBvcmdhbml6YXRpb25fYXBwbGljYXRpb25zOnJlYWQgb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczp3cml0ZSBvcmdhbml6YXRpb25fYXBwbGljYXRpb25zOmV4ZWN1dGUgYmFua3M6cmVhZCBiYW5rczp3cml0ZSBiYW5rczpleGVjdXRlIGJhbmtfYXBwbGljYXRpb25zOnJlYWQgYmFua19hcHBsaWNhdGlvbnM6d3JpdGUgYmFua19hcHBsaWNhdGlvbnM6ZXhlY3V0ZSB1c2VyczpyZWFkIHVzZXJzOndyaXRlIHVzZXJzOmV4ZWN1dGUgY291bnRlcnBhcnRpZXM6cmVhZCBjb3VudGVycGFydGllczpwaWk6cmVhZCBjdXN0b21lcnM6cmVhZCBjdXN0b21lcnM6cGlpOnJlYWQgYWNjb3VudHM6cmVhZCBhY2NvdW50czp3cml0ZSBwcmljZXM6cmVhZCBxdW90ZXM6ZXhlY3V0ZSBxdW90ZXM6cmVhZCB0cmFkZXM6ZXhlY3V0ZSB0cmFkZXM6cmVhZCB0cmFuc2ZlcnM6cmVhZCB0cmFuc2ZlcnM6d3JpdGUgdHJhbnNmZXJzOmV4ZWN1dGUgZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cGlpOnJlYWQgZXh0ZXJuYWxfYmFua19hY2NvdW50czp3cml0ZSBleHRlcm5hbF93YWxsZXRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czp3cml0ZSB3b3JrZmxvd3M6cmVhZCBkZXBvc2l0X2FkZHJlc3NlczpyZWFkIGRlcG9zaXRfYWRkcmVzc2VzOndyaXRlIGRlcG9zaXRfYmFua19hY2NvdW50czpyZWFkIGRlcG9zaXRfYmFua19hY2NvdW50czp3cml0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBpbnZvaWNlczpyZWFkIHN1YnNjcmlwdGlvbnM6cmVhZCBzdWJzY3JpcHRpb25zOndyaXRlIHN1YnNjcmlwdGlvbnM6ZXhlY3V0ZSBzdWJzY3JpcHRpb25fZXZlbnRzOnJlYWQgc3Vic2NyaXB0aW9uX2V2ZW50czpleGVjdXRlIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cmVhZCBpZGVudGl0eV92ZXJpZmljYXRpb25zOnBpaTpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6ZXhlY3V0ZSBwZXJzb25hX3Nlc3Npb25zOmV4ZWN1dGUgc2FyZGluZV9zZXNzaW9uczpleGVjdXRlIHBsYW5zOmV4ZWN1dGUgcGxhbnM6cmVhZCBleGVjdXRpb25zOmV4ZWN1dGUgZXhlY3V0aW9uczpyZWFkIGZpbGVzOnJlYWQgZmlsZXM6cGlpOnJlYWQgZmlsZXM6ZXhlY3V0ZVxcJyBgYGAgPGZvbnQgY29sb3I9XFxcIm9yYW5nZVxcXCI+KirimqDvuI8gTm90ZTogVGhlIGFib3ZlIGN1cmwgd2lsbCBjcmVhdGUgYSBiZWFyZXIgdG9rZW4gd2l0aCBmdWxsIHNjb3BlIGFjY2Vzcy4gRGVsZXRlIHNjb3BlcyBpZiB5b3VcXCdkIGxpa2UgdG8gcmVzdHJpY3QgYWNjZXNzLioqPC9mb250PiAgIyMgQXV0aGVudGljYXRpb24gU2NvcGVzICBUaGUgQ3licmlkIHBsYXRmb3JtIHN1cHBvcnRzIHRoZSB1c2Ugb2Ygc2NvcGVzIHRvIGNvbnRyb2wgdGhlIGxldmVsIG9mIGFjY2VzcyBhIHRva2VuIGlzIGxpbWl0ZWQgdG8uIFNjb3BlcyBkbyBub3QgZ3JhbnQgYWNjZXNzIHRvIHJlc291cmNlczsgaW5zdGVhZCwgdGhleSBwcm92aWRlIGxpbWl0cywgaW4gc3VwcG9ydCBvZiB0aGUgbGVhc3QgcHJpdmlsZWdlIHByaW5jaXBhbC4gIFRoZSBmb2xsb3dpbmcgc2NvcGVzIGFyZSBhdmFpbGFibGUgb24gdGhlIHBsYXRmb3JtIGFuZCBjYW4gYmUgcmVxdWVzdGVkIHdoZW4gZ2VuZXJhdGluZyBlaXRoZXIgYW4gT3JnYW5pemF0aW9uLCBCYW5rIG9yIEN1c3RvbWVyIHRva2VuLiBHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZSBfUmVhZF8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gcmVhZCBhbmQgbGlzdCByZXNvdXJjZXMsIHRoZSBfV3JpdGVfIHNjb3BlIGlzIHJlcXVpcmVkIHRvIHVwZGF0ZSBhIHJlc291cmNlIGFuZCB0aGUgX0V4ZWN1dGVfIHNjb3BlIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHJlc291cmNlLiAgfCBSZXNvdXJjZSAgICAgICAgICAgICAgfCBSZWFkIHNjb3BlIChUb2tlbiBUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV3JpdGUgc2NvcGUgKFRva2VuIFR5cGUpICAgICAgICAgICAgICAgICAgICAgIHwgRXhlY3V0ZSBzY29wZSAoVG9rZW4gVHlwZSkgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfCBBY2NvdW50ICAgICAgICAgICAgICAgfCBhY2NvdW50czpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWNjb3VudHM6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgICAgICAgICAgfCBiYW5rczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmspICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmFua3M6d3JpdGUgKE9yZ2FuaXphdGlvbiwgQmFuaykgICAgICAgICAgICAgIHwgYmFua3M6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgIHwgfCBDdXN0b21lciAgICAgICAgICAgICAgfCBjdXN0b21lcnM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgIHwgY3VzdG9tZXJzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgIHwgY3VzdG9tZXJzOmV4ZWN1dGUgKEJhbmspICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBDb3VudGVycGFydHkgICAgICAgICAgfCBjb3VudGVycGFydGllczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgIHwgY291bnRlcnBhcnRpZXM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgIHwgY291bnRlcnBhcnRpZXM6ZXhlY3V0ZSAoQmFuaykgICAgICAgICAgICAgICAgICAgIHwgfCBEZXBvc2l0IEFkZHJlc3MgICAgICAgfCBkZXBvc2l0X2FkZHJlc3NlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgIHwgZGVwb3NpdF9hZGRyZXNzZXM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSAgICAgIHwgZGVwb3NpdF9hZGRyZXNzZXM6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgIHwgfCBFeHRlcm5hbCBCYW5rIEFjY291bnQgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpIHwgZXh0ZXJuYWxfYmFua19hY2NvdW50czp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpIHwgZXh0ZXJuYWxfYmFua19hY2NvdW50czpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgIHwgfCBFeHRlcm5hbCBXYWxsZXQgICAgICAgfCBleHRlcm5hbF93YWxsZXQ6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0ZXJuYWxfd2FsbGV0OmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgIHwgfCBPcmdhbml6YXRpb24gICAgICAgICAgfCBvcmdhbml6YXRpb25zOnJlYWQgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3JnYW5pemF0aW9uczp3cml0ZSAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBVc2VyICAgICAgICAgICAgICAgICAgfCB1c2VyczpyZWFkIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXNlcnM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgIHwgfCBQcmljZSAgICAgICAgICAgICAgICAgfCBwcmljZXM6cmVhZCAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBRdW90ZSAgICAgICAgICAgICAgICAgfCBxdW90ZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXVvdGVzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgIHwgfCBUcmFkZSAgICAgICAgICAgICAgICAgfCB0cmFkZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhZGVzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgIHwgfCBUcmFuc2ZlciAgICAgICAgICAgICAgfCB0cmFuc2ZlcnM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNmZXJzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpIHwgfCBXb3JrZmxvdyAgICAgICAgICAgICAgfCB3b3JrZmxvd3M6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd29ya2Zsb3dzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgIHwgfCBJbnZvaWNlICAgICAgICAgICAgICAgfCBpbnZvaWNlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgIHwgaW52b2ljZXM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgIHwgaW52b2ljZXM6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgIHwgICMjIEF2YWlsYWJsZSBFbmRwb2ludHMgIFRoZSBhdmFpbGFibGUgQVBJcyBmb3IgdGhlIFtJZGVudGl0eV0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSwgW09yZ2FuaXphdGlvbl0oaHR0cHM6Ly9vcmdhbml6YXRpb24ucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgYW5kIFtCYW5rXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgQVBJIHNlcnZpY2VzIGFyZSBsaXN0ZWQgYmVsb3c6ICB8IEFQSSBTZXJ2aWNlICB8IE1vZGVsICAgICAgICAgICAgICAgIHwgQVBJIEVuZHBvaW50IFBhdGggICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfCBJZGVudGl0eSAgICAgfCBCYW5rICAgICAgICAgICAgICAgICB8IC9hcGkvYmFua19hcHBsaWNhdGlvbnMgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBiYW5rcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IElkZW50aXR5ICAgICB8IEN1c3RvbWVyVG9rZW4gICAgICAgIHwgL2FwaS9jdXN0b21lcl90b2tlbnMgICAgICAgICAgIHwgQ3JlYXRlIGN1c3RvbWVyIEpXVCBhY2Nlc3MgdG9rZW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgSWRlbnRpdHkgICAgIHwgT3JnYW5pemF0aW9uICAgICAgICAgfCAvYXBpL29yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnMgfCBDcmVhdGUgYW5kIGxpc3Qgb3JnYW5pemF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBJZGVudGl0eSAgICAgfCBPcmdhbml6YXRpb24gICAgICAgICB8IC9hcGkvdXNlcnMgICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBvcmdhbml6YXRpb24gdXNlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IE9yZ2FuaXphdGlvbiB8IE9yZ2FuaXphdGlvbiAgICAgICAgIHwgL2FwaS9vcmdhbml6YXRpb25zICAgICAgICAgICAgIHwgQVBJcyB0byByZXRyaWV2ZSBhbmQgdXBkYXRlIG9yZ2FuaXphdGlvbiBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQWNjb3VudCAgICAgICAgICAgICAgfCAvYXBpL2FjY291bnRzICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgYWNjb3VudHMsIHdoaWNoIGhvbGQgYSBzcGVjaWZpYyBhc3NldCBmb3IgYSBjdXN0b21lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBBc3NldCAgICAgICAgICAgICAgICB8IC9hcGkvYXNzZXRzICAgICAgICAgICAgICAgICAgICB8IEdldCBhIGxpc3Qgb2YgYXNzZXRzIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0gKGV4OiBCVEMsIEVUSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEJhbmsgICAgICAgICAgICAgICAgIHwgL2FwaS9iYW5rcyAgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCB1cGRhdGUgYW5kIGxpc3QgYmFua3MsIHRoZSBwYXJlbnQgdG8gY3VzdG9tZXJzLCBhY2NvdW50cywgZXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQ3VzdG9tZXIgICAgICAgICAgICAgfCAvYXBpL2N1c3RvbWVycyAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgY3VzdG9tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBDb3VudGVycGFydHkgICAgICAgICB8IC9hcGkvY291bnRlcnBhcnRpZXMgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBjb3VudGVycGFydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IERlcG9zaXRBZGRyZXNzICAgICAgIHwgL2FwaS9kZXBvc2l0X2FkZHJlc3NlcyAgICAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgZGVwb3NpdCBhZGRyZXNzZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgRXh0ZXJuYWxCYW5rQWNjb3VudCAgfCAvYXBpL2V4dGVybmFsX2JhbmtfYWNjb3VudHMgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCBleHRlcm5hbCBiYW5rIGFjY291bnRzLCB3aGljaCBjb25uZWN0IGN1c3RvbWVyIGJhbmsgYWNjb3VudHMgdG8gdGhlIHBsYXRmb3JtIHwgfCBCYW5rICAgICAgICAgfCBFeHRlcm5hbFdhbGxldCAgICAgICB8IC9hcGkvZXh0ZXJuYWxfd2FsbGV0cyAgICAgICAgICB8IENyZWF0ZSwgZ2V0LCBsaXN0IGFuZCBkZWxldGUgZXh0ZXJuYWwgd2FsbGV0cywgd2hpY2ggY29ubmVjdCBjdXN0b21lciB3YWxsZXRzIHRvIHRoZSBwbGF0Zm9ybSAgICAgfCB8IEJhbmsgICAgICAgICB8IElkZW50aXR5VmVyaWZpY2F0aW9uIHwgL2FwaS9pZGVudGl0eV92ZXJpZmljYXRpb25zICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGlkZW50aXR5IHZlcmlmaWNhdGlvbnMsIHdoaWNoIGFyZSBwZXJmb3JtZWQgb24gY3VzdG9tZXJzIGZvciBLWUMgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgSW52b2ljZSAgICAgICAgICAgICAgfCAvYXBpL2ludm9pY2VzICAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIGdldCwgY2FuY2VsIGFuZCBsaXN0IGludm9pY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBQYXltZW50SW5zdHJ1Y3Rpb24gICB8IC9hcGkvcGF5bWVudF9pbnN0cnVjdGlvbnMgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IHBheW1lbnQgaW5zdHJ1Y3Rpb25zIGZvciBpbnZvaWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFByaWNlICAgICAgICAgICAgICAgIHwgL2FwaS9wcmljZXMgICAgICAgICAgICAgICAgICAgIHwgR2V0IHRoZSBjdXJyZW50IHByaWNlcyBmb3IgYXNzZXRzIG9uIHRoZSBwbGF0Zm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgUXVvdGUgICAgICAgICAgICAgICAgfCAvYXBpL3F1b3RlcyAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgcXVvdGVzLCB3aGljaCBhcmUgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0cmFkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBTeW1ib2wgICAgICAgICAgICAgICB8IC9hcGkvc3ltYm9scyAgICAgICAgICAgICAgICAgICB8IEdldCBhIGxpc3Qgb2Ygc3ltYm9scyBzdXBwb3J0ZWQgZm9yIHRyYWRlIChleDogQlRDLVVTRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFRyYWRlICAgICAgICAgICAgICAgIHwgL2FwaS90cmFkZXMgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IHRyYWRlcywgd2hpY2ggYnV5IG9yIHNlbGwgY3J5cHRvY3VycmVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgVHJhbnNmZXIgICAgICAgICAgICAgfCAvYXBpL3RyYW5zZmVycyAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCB0cmFuc2ZlcnMgKGUuZy4sIGZ1bmRpbmcsIGJvb2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBXb3JrZmxvdyAgICAgICAgICAgICB8IC9hcGkvd29ya2Zsb3dzICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IHdvcmtmbG93cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIyMgVW5kZXJzdGFuZGluZyBPYmplY3QgTW9kZWxzICYgRW5kcG9pbnRzICAqKk9yZ2FuaXphdGlvbnMqKiAgQW4gYE9yZ2FuaXphdGlvbmAgaXMgbWVhbnQgdG8gcmVwcmVzZW50IHRoZSBvcmdhbml6YXRpb24gcGFydG5lcmluZyB3aXRoIEN5YnJpZCB0byB1c2Ugb3VyIHBsYXRmb3JtLiAgQW4gYE9yZ2FuaXphdGlvbmAgdHlwaWNhbGx5IGRvZXMgbm90IGRpcmVjdGx5IGludGVyYWN0IHdpdGggYGN1c3RvbWVyc2AuIEluc3RlYWQsIGFuIE9yZ2FuaXphdGlvbiBoYXMgb25lIG9yIG1vcmUgYGJhbmtzYCwgd2hpY2ggZW5jb21wYXNzIHRoZSBmaW5hbmNpYWwgc2VydmljZSBvZmZlcmluZ3Mgb2YgdGhlIHBsYXRmb3JtLiAgKipCYW5rcyoqICBBIGBCYW5rYCBpcyBvd25lZCBieSBhbiBgT3JnYW5pemF0aW9uYCBhbmQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYW4gZW52aXJvbm1lbnQgb3IgY29udGFpbmVyIGZvciBgY3VzdG9tZXJzYCBhbmQgcHJvZHVjdCBvZmZlcmluZ3MuIEJhbmtzIGFyZSBjcmVhdGVkIGluIGVpdGhlciBgU2FuZGJveGAgb3IgYFByb2R1Y3Rpb25gIG1vZGUsIHdoZXJlIGBTYW5kYm94YCBpcyB0aGUgZW52aXJvbm1lbnQgdGhhdCB5b3Ugd291bGQgdGVzdCwgcHJvdG90eXBlIGFuZCBidWlsZCBpbiBwcmlvciB0byBtb3ZpbmcgdG8gYFByb2R1Y3Rpb25gLiAgQW4gYE9yZ2FuaXphdGlvbmAgY2FuIGhhdmUgbXVsdGlwbGUgYGJhbmtzYCwgaW4gZWl0aGVyIGBTYW5kYm94YCBvciBgUHJvZHVjdGlvbmAgZW52aXJvbm1lbnRzLiBBIGBTYW5kYm94IEJhbmtgIHdpbGwgYmUgYmFja2VkIGJ5IHN0dWJiZWQgZGF0YSBhbmQgcHJvY2VzcyBmbG93cy4gRm9yIGluc3RhbmNlLCBmdW5kaW5nIHNvdXJjZSB0cmFuc2ZlciBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0cmFkZXMgd2lsbCBiZSBzaW11bGF0ZWQgcmF0aGVyIHRoYW4gcGVyZm9ybWVkLCBob3dldmVyIGFzc2V0IHByaWNlcyBhcmUgcmVwcmVzZW50YXRpdmUgb2YgcmVhbC13b3JsZCB2YWx1ZXMuIFlvdSBoYXZlIGFuIHVubGltaXRlZCBhbW91bnQgb2Ygc2ltdWxhdGVkIGZpYXQgY3VycmVuY3kgZm9yIHRlc3RpbmcgcHVycG9zZXMuICAqKkN1c3RvbWVycyoqICBgQ3VzdG9tZXJzYCByZXByZXNlbnQgeW91ciBiYW5raW5nIHVzZXJzIG9uIHRoZSBwbGF0Zm9ybS4gQXQgcHJlc2VudCwgd2Ugb2ZmZXIgc3VwcG9ydCBmb3IgYEluZGl2aWR1YWxzYCBhcyBDdXN0b21lcnMuICBgQ3VzdG9tZXJzYCBtdXN0IGJlIHZlcmlmaWVkIChpLmUuLCBLWUNcXCdkKSBpbiBvdXIgc3lzdGVtIGJlZm9yZSB0aGV5IGNhbiBwbGF5IGFueSBwYXJ0IG9uIHRoZSBwbGF0Zm9ybSwgd2hpY2ggbWVhbnMgdGhleSBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBhbmQgYSBwYXNzaW5nIGBJZGVudGl0eSBWZXJpZmljYXRpb25gLiBTZWUgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbnMgc2VjdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyBhIGN1c3RvbWVyIGNhbiBiZSB2ZXJpZmllZC4gIGBDdXN0b21lcnNgIG11c3QgYWxzbyBoYXZlIGFuIGBBY2NvdW50YCB0byBiZSBhYmxlIHRvIHRyYW5zYWN0LCBpbiB0aGUgZGVzaXJlZCBhc3NldCBjbGFzcy4gU2VlIHRoZSBBY2NvdW50cyBBUElzIGZvciBtb3JlIGRldGFpbHMgb24gc2V0dGluZyB1cCBhY2NvdW50cyBmb3IgdGhlIGN1c3RvbWVyLiBcbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogdjAuMTI5Ljc1MlxuICogQ29udGFjdDogc3VwcG9ydEBjeWJyaWQuYXBwXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtdmFyaWFibGUgbWVtYmVyLW9yZGVyaW5nICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLFxuICAgICAgICAgSHR0cFJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBQYXJhbWV0ZXJDb2RlYywgSHR0cENvbnRleHQgXG4gICAgICAgIH0gICAgICAgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjIH0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2VuY29kZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ3J4anMnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBDdXN0b21lclRva2VuSWRwTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9jdXN0b21lclRva2VuJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEVycm9yUmVzcG9uc2VJZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL2Vycm9yUmVzcG9uc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL3Bvc3RDdXN0b21lclRva2VuJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMgfSAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5cblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21lclRva2Vuc1NlcnZpY2Uge1xuXG4gICAgcHJvdGVjdGVkIGJhc2VQYXRoID0gJ2h0dHBzOi8vaWQuc2FuZGJveC5jeWJyaWQuYXBwJztcbiAgICBwdWJsaWMgZGVmYXVsdEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgcHVibGljIGVuY29kZXI6IEh0dHBQYXJhbWV0ZXJDb2RlYztcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKUBJbmplY3QoQkFTRV9QQVRIKSBiYXNlUGF0aDogc3RyaW5nLCBAT3B0aW9uYWwoKSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBiYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuY29kZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlciB8fCBuZXcgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjKCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtcyhodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXM6IEh0dHBQYXJhbXMsIHZhbHVlPzogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgKHZhbHVlIGFzIGFueVtdKS5mb3JFYWNoKCBlbGVtID0+IGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCBlbGVtLCBrZXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksICh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpLnN1YnN0cigwLCAxMCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIERhdGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaCggayA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoXG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMsIHZhbHVlW2tdLCBrZXkgIT0gbnVsbCA/IGAke2tleX0uJHtrfWAgOiBrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBjdXN0b21lciBhY2Nlc3MgdG9rZW5cbiAgICAgKiBDcmVhdGVzIGEgY3VzdG9tZXIgSldUIGFjY2VzcyB0b2tlbi4gIFJlcXVpcmVkIHNjb3BlczogKipjdXN0b21lcnM6d3JpdGUqKiBhbmQgKipjdXN0b21lcnM6cmVhZCoqXG4gICAgICogQHBhcmFtIHBvc3RDdXN0b21lclRva2VuSWRwTW9kZWwgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUN1c3RvbWVyVG9rZW4ocG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbDogUG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbCwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEN1c3RvbWVyVG9rZW5JZHBNb2RlbD47XG4gICAgcHVibGljIGNyZWF0ZUN1c3RvbWVyVG9rZW4ocG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbDogUG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbCwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8Q3VzdG9tZXJUb2tlbklkcE1vZGVsPj47XG4gICAgcHVibGljIGNyZWF0ZUN1c3RvbWVyVG9rZW4ocG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbDogUG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbCwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEN1c3RvbWVyVG9rZW5JZHBNb2RlbD4+O1xuICAgIHB1YmxpYyBjcmVhdGVDdXN0b21lclRva2VuKHBvc3RDdXN0b21lclRva2VuSWRwTW9kZWw6IFBvc3RDdXN0b21lclRva2VuSWRwTW9kZWwsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKHBvc3RDdXN0b21lclRva2VuSWRwTW9kZWwgPT09IG51bGwgfHwgcG9zdEN1c3RvbWVyVG9rZW5JZHBNb2RlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBwb3N0Q3VzdG9tZXJUb2tlbklkcE1vZGVsIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlQ3VzdG9tZXJUb2tlbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxDdXN0b21lclRva2VuSWRwTW9kZWw+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL2N1c3RvbWVyX3Rva2Vuc2AsXG4gICAgICAgICAgICBwb3N0Q3VzdG9tZXJUb2tlbklkcE1vZGVsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxufVxuIl19
|